buyGoodModal.vue 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210
  1. <template>
  2. <el-dialog
  3. :title="'竞价单选定商品下单'"
  4. :center="true"
  5. align="left"
  6. top="5vh"
  7. width="1040px"
  8. @close="showModelThis = false"
  9. :close-on-click-modal="false"
  10. :visible.sync="showModelThis"
  11. v-loading="loading"
  12. element-loading-text="拼命加载中"
  13. element-loading-spinner="el-icon-loading"
  14. element-loading-background="rgba(0, 0, 0, 0.8)"
  15. append-to-body
  16. >
  17. <el-card style="margin-top: -20px">
  18. <el-row>
  19. <el-col :span="24">
  20. <show-data-table
  21. style="margin: 0; padding: 0"
  22. :newTime="newTime"
  23. v-if="newTime !== '' && sitem"
  24. :sitem="sitem"
  25. border
  26. :columns="ShowDataTableColumns"
  27. >
  28. <template slot="specinfo">
  29. <span v-for="(si, sii) in sitem.specinfo" :key="si.specid + sii">
  30. <span v-if="sii !== 0">--</span
  31. ><span>{{ si.spec_name }}[{{ si.spec_value_name }}]</span></span
  32. >
  33. </template>
  34. <template slot="is_noble">
  35. <span v-if="sitem.is_noble">
  36. {{ sitem.noble_weight }}g--{{ sitem.metal_name }}--{{
  37. sitem.is_diff === "1" ? "有" : "无"
  38. }}工差--{{ sitem.config }}--{{ sitem.other_config }}</span
  39. >
  40. <span v-else>非贵金属商品</span>
  41. </template>
  42. <template slot="in_num">
  43. <span>{{ sitem.in_num }}{{ sitem.unit }}</span>
  44. </template>
  45. </show-data-table>
  46. </el-col>
  47. <el-col :span="24" style="padding: 18px 0 0 0">
  48. <el-form
  49. ref="ruleForm"
  50. :model="ruleForm"
  51. status-icon
  52. :rules="rulesThis"
  53. :size="'mini'"
  54. label-width="55px"
  55. class="demo-ruleForm"
  56. >
  57. <el-row>
  58. <el-col :span="5">
  59. <el-form-item label="数量" prop="good_num">
  60. <!--:min="sitem.in_num"-->
  61. <digital-input
  62. :values="ruleForm.good_num"
  63. :placeholder="'数量'"
  64. :min="1"
  65. :max="100000000000"
  66. :position="'right'"
  67. :precision="0"
  68. :size="'mini'"
  69. :controls="false"
  70. :disabled="false"
  71. :append="sitem.unit"
  72. @reschange="num_change($event, 'good_num')"
  73. />
  74. </el-form-item>
  75. </el-col>
  76. <el-col :span="6">
  77. <el-form-item label="单价" prop="sale_price">
  78. <digital-input
  79. :values="ruleForm.sale_price"
  80. :placeholder="'商品单价'"
  81. :min="sitem.sale_price"
  82. :max="100000000000"
  83. :position="'right'"
  84. :precision="2"
  85. :size="'mini'"
  86. :controls="false"
  87. :disabled="false"
  88. :append="'元'"
  89. @reschange="num_change($event, 'sale_price')"
  90. />
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="6">
  94. <el-form-item label="总金额" prop="good_num" label-width="70px">
  95. <el-input
  96. v-model="total_price"
  97. placeholder="总金额"
  98. disabled
  99. maxlength="500"
  100. />
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span="5">
  104. <el-form-item label="发货方式" prop="sendtype" label-width="90px">
  105. <el-select
  106. v-model="ruleForm.sendtype"
  107. placeholder="发货方式"
  108. style="width: 100%"
  109. >
  110. <el-option
  111. v-for="item in options"
  112. :key="item.value"
  113. :label="item.label"
  114. :value="item.value"
  115. >
  116. </el-option>
  117. </el-select>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="2" style="text-align: right">
  121. <el-button
  122. :size="'mini'"
  123. type="primary"
  124. :disabled="loading"
  125. @click="submitForm"
  126. >保 存
  127. </el-button>
  128. </el-col>
  129. <el-col :span="24">
  130. <el-form-item label="订单备注" prop="remark" label-width="85px">
  131. <el-input
  132. v-model="ruleForm.remark"
  133. maxlength="500"
  134. placeholder="订单备注"
  135. />
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="12">
  139. <el-row>
  140. <el-col :span="12"
  141. ><el-form-item label="凭证类型" prop="proof_type" label-width="85px">
  142. <el-select
  143. v-model="ruleForm.proof_type"
  144. @change="set_proof_url()"
  145. placeholder="凭证类型"
  146. style="width: 100%"
  147. >
  148. <el-option
  149. v-for="item in proof_options"
  150. :key="item.value"
  151. :label="item.label"
  152. :value="item.value"
  153. >
  154. </el-option>
  155. </el-select>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="12">
  159. <el-form-item label="到货时间" prop="arrtime" label-width="85px">
  160. <el-date-picker
  161. v-model="ruleForm.arrtime"
  162. type="date"
  163. style="width: 100%"
  164. :disabled="false"
  165. value-format="yyyy-MM-dd"
  166. :picker-options="pickerOptions"
  167. placeholder="要求到货时间"
  168. @change="mdDate"
  169. >
  170. </el-date-picker>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="24">
  174. <el-form-item label="凭证文件" prop="proof_url" label-width="85px">
  175. <ul class="shangchuan-ul">
  176. <li v-if="ruleForm.proof_type === '1'" class="shiping">
  177. <div v-if="video_url" class="clearfix">
  178. <el-popover placement="top" width="300" trigger="hover">
  179. <video width="275" controls class="fl">
  180. <source :src="video_url" type="video/mp4" />
  181. <source :src="video_url" type="video/avi" />
  182. 您的浏览器不支持Video标签。
  183. </video>
  184. <i
  185. class="el-icon-video-camera-solid hover"
  186. style="font-size: 18px"
  187. slot="reference"
  188. ></i>
  189. </el-popover>
  190. <el-link
  191. :underline="false"
  192. @click="deleteUrl('1')"
  193. type="warning"
  194. style="margin: 0 0 0 16px"
  195. >删除</el-link
  196. >
  197. </div>
  198. <div class="activity-upload" v-else>
  199. <div class="btnupload" style="position: relative">
  200. <i class="el-icon-plus avatar-uploader-icon"></i>
  201. <video-upload
  202. class="Upload"
  203. :disabled="type === 'view' || type === 'editCoin'"
  204. :accept="'.mp4,.avi'"
  205. :multiple="false"
  206. :uploadcondition="beforeVideoUpload"
  207. @UploadErrorEvent="UploadVideoEventproof_url"
  208. @UploadSuccessEvent="UploadSuccessVideoproof_url"
  209. />
  210. </div>
  211. <div class="txt-tips fl">
  212. <p>建议大小:小于10MB</p>
  213. <p>文件格式:.mp4,.avi</p>
  214. </div>
  215. </div>
  216. </li>
  217. <li v-if="ruleForm.proof_type === '2'" class="tupian">
  218. <div v-if="img_url" class="clearfix">
  219. <img
  220. style="width: 50px; height: 50px"
  221. :src="img_url"
  222. class="avatar fl"
  223. />
  224. <el-link
  225. :underline="false"
  226. @click="deleteUrl('2')"
  227. type="warning"
  228. style="margin: 0 0 0 16px"
  229. >删除</el-link
  230. >
  231. </div>
  232. <div class="activity-upload" v-else>
  233. <div class="btnupload" style="position: relative">
  234. <i class="el-icon-plus avatar-uploader-icon"></i>
  235. <file-upload
  236. class="Upload"
  237. :disabled="type === 'view' || type === 'editCoin'"
  238. :accept="'.jpg,.png,.jpeg'"
  239. :multiple="false"
  240. :uploadcondition="beforeAvatarUpload"
  241. @UploadErrorEvent="UploadErrorEventproof_url"
  242. @UploadSuccessEvent="UploadSuccessEventproof_url"
  243. ></file-upload>
  244. </div>
  245. <div class="txt-tips fl">
  246. <p>建议大小:小于1MB</p>
  247. <p>文件格式:.jpg,.png,.jpeg</p>
  248. </div>
  249. </div>
  250. </li>
  251. <li v-if="ruleForm.proof_type === '3'" class="qita">
  252. <div v-if="other_url" class="clearfix">
  253. <a :href="other_url" download="凭证文件">点击下载</a>
  254. <el-link
  255. :underline="false"
  256. @click="deleteUrl('3')"
  257. type="warning"
  258. style="margin: 0 0 0 16px"
  259. >删除</el-link
  260. >
  261. </div>
  262. <div class="activity-upload" v-else>
  263. <div class="btnupload" style="position: relative">
  264. <i class="el-icon-plus avatar-uploader-icon"></i>
  265. <file-upload-pdf
  266. class="Upload"
  267. :accept="'.xlsx,.xls,.pdf,.zip,.rar,.7z'"
  268. :multiple="false"
  269. :uploadcondition="beforeOtherUpload"
  270. @UploadErrorEvent="UploadErrorOtherproof_url"
  271. @UploadSuccessEvent="UploadSuccessOtherproof_url"
  272. />
  273. </div>
  274. <div class="txt-tips fl">
  275. <p>建议大小:小于5MB</p>
  276. <p>文件格式:.xlsx,.xls,.pdf,.zip,.rar,.7z</p>
  277. </div>
  278. </div>
  279. </li>
  280. </ul>
  281. </el-form-item>
  282. </el-col>
  283. </el-row>
  284. </el-col>
  285. <el-col :span="12">
  286. <el-form-item label="其他单号" prop="workNo" label-width="115px">
  287. <el-input
  288. v-model="ruleForm.workNo"
  289. maxlength="2000"
  290. type="textarea"
  291. :rows="2"
  292. show-word-limit
  293. placeholder="如: 业管单号"
  294. />
  295. </el-form-item>
  296. </el-col>
  297. <el-col :span="12">
  298. <el-form-item
  299. label="平台订单号"
  300. prop="platform_order"
  301. label-width="115px"
  302. >
  303. <el-input
  304. v-model="ruleForm.platform_order"
  305. maxlength="2000"
  306. type="textarea"
  307. :rows="2"
  308. show-word-limit
  309. placeholder="如: PO号"
  310. />
  311. </el-form-item>
  312. </el-col>
  313. </el-row>
  314. </el-form>
  315. </el-col>
  316. <el-col :span="24" v-if="ruleForm.sendtype === '1'">
  317. <el-form :model="addrForm" ref="addrForm" :size="'mini'">
  318. <el-table
  319. :data="addrForm.order_addr"
  320. border
  321. :size="'mini'"
  322. style="width: 100%"
  323. max-height="300px"
  324. row-key="key"
  325. >
  326. <el-table-column type="index" width="50" show-overflow-tooltip />
  327. <el-table-column
  328. prop="receipt_quantity"
  329. label="收货总数"
  330. min-width="125"
  331. show-overflow-tooltip
  332. >
  333. <template slot-scope="scope">
  334. <el-form-item
  335. v-if="scope.row.edit"
  336. :prop="'order_addr.' + scope.$index + '.' + 'receipt_quantity'"
  337. :rules="addrRules.receipt_quantity"
  338. :size="'mini'"
  339. :style="{ marginBottom: scope.row.edit ? '13px' : '0' }"
  340. >
  341. <el-input
  342. v-model="scope.row.receipt_quantity"
  343. placeholder="收货总数"
  344. :disabled="!scope.row.edit"
  345. maxlength="10"
  346. />
  347. </el-form-item>
  348. <span v-if="!scope.row.edit">{{ scope.row.receipt_quantity }}</span>
  349. </template>
  350. </el-table-column>
  351. <el-table-column
  352. prop="contactor"
  353. label="收件联系人"
  354. min-width="110"
  355. show-overflow-tooltip
  356. >
  357. <template slot-scope="scope">
  358. <el-form-item
  359. v-if="scope.row.edit"
  360. :prop="'order_addr.' + scope.$index + '.' + 'contactor'"
  361. :rules="addrRules.contactor"
  362. :size="'mini'"
  363. :style="{ marginBottom: scope.row.edit ? '13px' : '0' }"
  364. >
  365. <el-input
  366. v-model="scope.row.contactor"
  367. placeholder="收件联系人"
  368. maxlength="20"
  369. :disabled="!scope.row.edit"
  370. />
  371. </el-form-item>
  372. <span v-if="!scope.row.edit">{{ scope.row.contactor }}</span>
  373. </template>
  374. </el-table-column>
  375. <el-table-column
  376. prop="mobile"
  377. label="收货联系电话"
  378. min-width="130"
  379. show-overflow-tooltip
  380. >
  381. <template slot-scope="scope">
  382. <el-form-item
  383. v-if="scope.row.edit"
  384. :prop="'order_addr.' + scope.$index + '.' + 'mobile'"
  385. :rules="addrRules.mobile"
  386. :size="'mini'"
  387. :style="{ marginBottom: scope.row.edit ? '13px' : '0' }"
  388. >
  389. <el-input
  390. v-model="scope.row.mobile"
  391. placeholder="收货联系电话"
  392. :disabled="!scope.row.edit"
  393. maxlength="11"
  394. />
  395. </el-form-item>
  396. <span v-if="!scope.row.edit">{{ scope.row.mobile }}</span>
  397. </template>
  398. </el-table-column>
  399. <el-table-column
  400. prop="addr_code"
  401. label="收货省市区"
  402. min-width="230"
  403. show-overflow-tooltip
  404. >
  405. <template slot-scope="scope">
  406. <el-form-item
  407. v-if="scope.row.edit"
  408. :prop="'order_addr.' + scope.$index + '.' + 'addr_code'"
  409. :rules="addrRules.addr_code"
  410. :size="'mini'"
  411. :style="{ marginBottom: scope.row.edit ? '13px' : '0' }"
  412. >
  413. <select-area
  414. :value="scope.row.addr_code"
  415. :disabled="!scope.row.edit"
  416. placeholder="收货省市区"
  417. :size="'mini'"
  418. @selectChange="select_area_change($event, scope.$index)"
  419. />
  420. </el-form-item>
  421. <span v-if="!scope.row.edit">{{ scope.row.addr_code_name }}</span>
  422. </template>
  423. </el-table-column>
  424. <el-table-column
  425. prop="addr"
  426. label="详细地址"
  427. min-width="170"
  428. show-overflow-tooltip
  429. >
  430. <template slot-scope="scope">
  431. <el-form-item
  432. v-if="scope.row.edit"
  433. :prop="'order_addr.' + scope.$index + '.' + 'addr'"
  434. :rules="addrRules.addr"
  435. :size="'mini'"
  436. :style="{ marginBottom: scope.row.edit ? '13px' : '0' }"
  437. >
  438. <el-input
  439. v-model="scope.row.addr"
  440. placeholder="详细地址"
  441. :disabled="!scope.row.edit"
  442. maxlength="100"
  443. />
  444. </el-form-item>
  445. <span v-if="!scope.row.edit">{{ scope.row.addr }}</span>
  446. </template>
  447. </el-table-column>
  448. <el-table-column fixed="right" width="94" show-overflow-tooltip>
  449. <template slot="header" slot-scope="scope">
  450. <el-tooltip
  451. class="fr"
  452. style="margin: 3px 0 0 8px"
  453. effect="dark"
  454. content="手动添加地址"
  455. placement="top"
  456. >
  457. <i
  458. class="el-icon-circle-plus-outline tb-icon"
  459. style="color: #63cbe7"
  460. @click="openHouseModal(-1)"
  461. ></i>
  462. </el-tooltip>
  463. <el-tooltip
  464. class="fr"
  465. style="margin: 3px 0 0 8px"
  466. effect="dark"
  467. content="导入收货地址"
  468. placement="top"
  469. >
  470. <i
  471. class="el-icon-upload2 tb-icon"
  472. style="color: #63cbe7"
  473. @click="addrmodel = true"
  474. ></i>
  475. </el-tooltip>
  476. <el-tooltip
  477. class="fr"
  478. style="margin: 3px 0 0 0"
  479. effect="dark"
  480. content="下载收货地址模板"
  481. placement="top"
  482. >
  483. <a class="downloadAddr" href="./static/收货地址模板.xlsx">
  484. <i
  485. class="el-icon-download tb-icon"
  486. style="color: #63cbe7; margin: 0"
  487. ></i>
  488. </a>
  489. </el-tooltip>
  490. </template>
  491. <template slot-scope="scope">
  492. <el-tooltip
  493. effect="dark"
  494. content="编辑"
  495. v-if="!scope.row.edit"
  496. placement="top"
  497. >
  498. <i
  499. class="el-icon-edit tb-icon"
  500. @click="openHouseModal(scope.$index)"
  501. ></i>
  502. </el-tooltip>
  503. <el-tooltip
  504. effect="dark"
  505. content="保存"
  506. v-if="scope.row.edit"
  507. placement="top"
  508. >
  509. <i
  510. class="el-icon-circle-check tb-icon"
  511. @click="checkRow(scope.$index)"
  512. ></i>
  513. </el-tooltip>
  514. <el-tooltip effect="dark" content="删除" placement="top">
  515. <i
  516. class="el-icon-delete tb-icon"
  517. @click="deleteRow(scope.$index, addrForm.order_addr)"
  518. ></i>
  519. </el-tooltip>
  520. </template>
  521. </el-table-column>
  522. </el-table>
  523. </el-form>
  524. </el-col>
  525. <el-col :span="24">
  526. <in-addr-model
  527. :show-model="addrmodel"
  528. @cancel="addrmodel = false"
  529. @refresh="addrRefresh"
  530. />
  531. </el-col>
  532. </el-row>
  533. </el-card>
  534. </el-dialog>
  535. </template>
  536. <script>
  537. import resToken from "@/mixins/resToken";
  538. import asyncRequest from "@/apis/service/sellOut/zixunOrder";
  539. import searchStockGoodModal from "@/components/search-stock-good-modal";
  540. import { isnumber, isMobile } from "@/utils/validate";
  541. import inAddrModel from "@/components/in-addr-model";
  542. import { ShowDataTableColumns } from "./ShowDataTableColumns";
  543. export default {
  544. name: "buyGoodModal",
  545. props: ["showModel", "sitem"],
  546. mixins: [resToken],
  547. components: { searchStockGoodModal, inAddrModel },
  548. data() {
  549. const validatemobile = (rule, value, callback) => {
  550. if (value === "") {
  551. callback(new Error("手机号不能为空!"));
  552. } else {
  553. if (!isMobile(value)) {
  554. callback(new Error("手机号格式不正确!"));
  555. } else {
  556. callback();
  557. }
  558. }
  559. };
  560. const validateWeight = (rule, value, callback) => {
  561. if (value === "") {
  562. callback(new Error("收货总数不能为空!"));
  563. } else {
  564. if (!isnumber(value)) {
  565. callback(new Error("收货总数仅支持整数!"));
  566. } else {
  567. callback();
  568. }
  569. }
  570. };
  571. const validate_num_0 = (rule, value, callback) => {
  572. const { required } = rule;
  573. if (required && value === "") {
  574. callback(new Error("不能为空!"));
  575. } else if (
  576. required &&
  577. (value === "0" ||
  578. value === "0." ||
  579. value === "0.0" ||
  580. value === "0.00" ||
  581. value === "0.000")
  582. ) {
  583. callback(new Error("不能为零!"));
  584. } else {
  585. callback();
  586. }
  587. };
  588. return {
  589. loading: false,
  590. total_price: "0",
  591. addrmodel: false,
  592. showModelThis: this.showModel,
  593. showGoodsModel: false,
  594. ShowDataTableColumns: ShowDataTableColumns,
  595. video_url: "",
  596. img_url: "",
  597. other_url: "",
  598. proof_options: [
  599. {
  600. value: "1",
  601. label: "视频",
  602. },
  603. {
  604. value: "2",
  605. label: "图片",
  606. },
  607. {
  608. value: "3",
  609. label: "其他",
  610. },
  611. ],
  612. pickerOptions: {
  613. disabledDate: (time) => {
  614. return time.getTime() < new Date(this.sitem.in_arrival_time).getTime();
  615. },
  616. },
  617. options: [
  618. {
  619. value: "1",
  620. label: "直接发货",
  621. },
  622. {
  623. value: "2",
  624. label: "延时发货",
  625. },
  626. ],
  627. stock_code: "",
  628. cat_id: "",
  629. ruleForm: {
  630. bidNo: "", //竞价单反馈编号
  631. good_num: "", //商品数量
  632. sale_price: "",
  633. sendtype: "1", // 发货方式
  634. arrtime: "", // 到货时间
  635. remark: "", //订单备注
  636. platform_order: "", //平台订单号
  637. workNo: "", //其他单号
  638. },
  639. rulesThis: this.rules,
  640. rules: {
  641. good_num: [
  642. {
  643. required: true,
  644. validator: validate_num_0,
  645. trigger: "blur",
  646. },
  647. ],
  648. sale_price: [
  649. {
  650. required: true,
  651. validator: validate_num_0,
  652. trigger: "blur",
  653. },
  654. ],
  655. sendtype: [
  656. {
  657. required: true,
  658. message: "请选择发货方式",
  659. trigger: "change",
  660. },
  661. ],
  662. remark: [
  663. {
  664. required: true,
  665. message: "输入订单备注",
  666. trigger: "blur",
  667. },
  668. ],
  669. arrtime: [
  670. {
  671. required: true,
  672. message: "要求到货时间",
  673. trigger: "change",
  674. },
  675. ],
  676. proof_type: [
  677. {
  678. required: false,
  679. message: "请选择凭证类型",
  680. trigger: "change",
  681. },
  682. ],
  683. proof_url: [
  684. {
  685. required: false,
  686. message: "请上传凭证文件",
  687. trigger: "blur,change",
  688. },
  689. ],
  690. },
  691. addrForm: {
  692. order_addr: [], //收货地址
  693. },
  694. addrRules: {
  695. receipt_quantity: [
  696. {
  697. required: true,
  698. validator: validateWeight,
  699. trigger: "blur",
  700. },
  701. ],
  702. contactor: [
  703. {
  704. required: true,
  705. trigger: "blur",
  706. message: "联系人不能为空",
  707. },
  708. ],
  709. mobile: [
  710. {
  711. required: true,
  712. validator: validatemobile,
  713. trigger: "blur",
  714. },
  715. ],
  716. addr_code: [
  717. {
  718. type: "array",
  719. required: false,
  720. message: "收货省市区不能为空",
  721. trigger: "change",
  722. },
  723. ],
  724. addr: [
  725. {
  726. required: true,
  727. message: "详细地址不能为空",
  728. trigger: "blur",
  729. },
  730. ],
  731. },
  732. loading: false,
  733. id: "",
  734. };
  735. },
  736. created() {
  737. // this.this.ruleForm.arrtime = this.sitem.in_arrival_time.substring(0, 10);
  738. },
  739. watch: {
  740. showModel: function (val) {
  741. this.showModelThis = val;
  742. if (val) {
  743. // this.rulesThis = this.rules;
  744. this.initForm();
  745. }
  746. },
  747. showModelThis(val) {
  748. if (!val) {
  749. this.$emit("cancel");
  750. }
  751. },
  752. },
  753. methods: {
  754. //修改日期校验
  755. mdDate() {
  756. //用户传递的到货时间不能大于要求到货的时间 对要求到货时间进行字符截取10位抹除时分秒
  757. if (
  758. Date.parse(this.ruleForm.arrtime) <
  759. Date.parse(this.sitem.in_arrival_time.substring(0, 10))
  760. ) {
  761. this.$message.warning("到货时间不能小于要求到货日期");
  762. this.ruleForm.arrtime = "";
  763. }
  764. },
  765. closeModel() {
  766. console.log("closeModel!!");
  767. this.showModelThis = false;
  768. },
  769. num_change(e, key) {
  770. this.ruleForm[key] = e + "";
  771. this.$refs.ruleForm.validateField(key);
  772. this.set_total_price();
  773. },
  774. set_total_price() {
  775. const { good_num, sale_price } = this.ruleForm;
  776. let num = good_num * 1;
  777. let price = sale_price * 1;
  778. this.total_price = num * price + "";
  779. },
  780. async initForm() {
  781. this.loading = true;
  782. this.rulesThis = this.rules;
  783. console.log(this.sitem);
  784. const { can } = this.sitem;
  785. this.sitem.can_name = "";
  786. this.sitem.is_noble = false;
  787. if (can && can.length > 0) {
  788. can.forEach((a, ai) => {
  789. this.sitem.is_noble = a.id === "6";
  790. this.sitem.can_name += `${ai !== 0 ? "_" : ""}${a.name}`;
  791. });
  792. }
  793. await this.resetForm();
  794. this.getNewTime();
  795. this.set_total_price();
  796. this.loading = false;
  797. },
  798. addrRefresh(e) {
  799. const { list } = e;
  800. this.addrForm.order_addr.push(...list);
  801. },
  802. getNewTime() {
  803. this.newTime = new Date().valueOf();
  804. },
  805. async resetForm() {
  806. //重置
  807. await this.$nextTick(() => {
  808. if (this.$refs.ruleForm) {
  809. this.$refs.ruleForm.resetFields();
  810. this.$refs.ruleForm.clearValidate();
  811. const { bidNo, in_num, in_arrival_time, sale_price, remark } = this.sitem;
  812. this.ruleForm = {
  813. bidNo: bidNo || "", //竞价单反馈编号
  814. good_num: in_num || "0", //商品数量
  815. sale_price: sale_price || "",
  816. sendtype: "1", // 发货方式
  817. arrtime: in_arrival_time || "", // 到货时间
  818. remark: "",
  819. proof_type: "1", // 通过or驳回
  820. proof_url: "", //驳回至
  821. };
  822. }
  823. if (this.$refs.addrForm) {
  824. this.$refs.addrForm.resetFields();
  825. this.$refs.addrForm.clearValidate();
  826. this.addrForm = {
  827. order_addr: [],
  828. };
  829. }
  830. });
  831. },
  832. openHouseModal(index) {
  833. let findex = this.addrForm.order_addr.findIndex((v) => v.edit === true);
  834. if (findex !== -1) {
  835. this.$message.warning("当前已有地址在编辑,请保存后再试!");
  836. return;
  837. } else {
  838. if (index === -1) {
  839. this.addrForm.order_addr.push({
  840. edit: true,
  841. receipt_quantity: "",
  842. contactor: "",
  843. mobile: "",
  844. addr_code: [],
  845. addr: "",
  846. });
  847. } else {
  848. this.addrForm.order_addr[index].edit = true;
  849. }
  850. }
  851. },
  852. //省市区选择
  853. async select_area_change(e, index) {
  854. this.addrForm.order_addr[index].addr_code = e;
  855. const { addr_code } = this.addrForm.order_addr[index];
  856. if (addr_code && addr_code.length === 3) {
  857. let arrCode = addr_code[addr_code.length - 1];
  858. // console.log(model);
  859. let { code, data, message } = await asyncRequest.addrall({
  860. code: arrCode,
  861. });
  862. if (code === 0) {
  863. const { province, city, area } = data;
  864. let province_name = province && province.name ? province.name : "";
  865. let city_name = city && city.name ? city.name : "";
  866. let area_name = area && area.name ? area.name : "";
  867. this.addrForm.order_addr[index].addr_code_name =
  868. province_name && city_name && area_name
  869. ? `${province_name}/${city_name}/${area_name}`
  870. : "";
  871. } else if (code >= 100 && code <= 104) {
  872. await this.logout();
  873. } else {
  874. this.$message.warning(message);
  875. }
  876. } else {
  877. this.addrForm.order_addr[index].addr_code_name = "";
  878. }
  879. },
  880. //省市区保存某一行
  881. checkRow(rowIndex) {
  882. this.$refs.addrForm.validate((valid) => {
  883. if (valid) {
  884. this.addrForm.order_addr[rowIndex].edit = false;
  885. } else {
  886. console.log("error submit!!");
  887. return false;
  888. }
  889. });
  890. },
  891. // 省市区删除行操作
  892. deleteRow(index, rows) {
  893. rows.splice(index, 1);
  894. },
  895. async submitForm() {
  896. await this.$refs.ruleForm.validate(async (valid) => {
  897. if (valid) {
  898. if (this.loading) return;
  899. this.loading = true;
  900. let model = JSON.parse(JSON.stringify(this.ruleForm));
  901. model.order_addr = [];
  902. const { sendtype, good_num } = model;
  903. const { order_addr } = JSON.parse(JSON.stringify(this.addrForm));
  904. if (sendtype === "1" && order_addr && order_addr.length === 0) {
  905. this.$message.warning("至少上传一个地址信息!");
  906. this.loading = false;
  907. return;
  908. }
  909. if (sendtype === "1") {
  910. let addrT = 0,
  911. isAEdit = false;
  912. order_addr.forEach((v2) => {
  913. if (v2.edit) {
  914. isAEdit = true;
  915. }
  916. addrT += parseInt(v2.receipt_quantity + "");
  917. let model2 = {
  918. addr_code: v2.addr_code.toString(),
  919. contactor: v2.contactor,
  920. mobile: v2.mobile,
  921. addr: v2.addr,
  922. receipt_quantity: v2.receipt_quantity,
  923. };
  924. model.order_addr.push(model2);
  925. });
  926. if (isAEdit) {
  927. this.$message.warning("请保存地址信息!");
  928. this.loading = false;
  929. return;
  930. }
  931. if (parseInt(good_num + "") !== addrT) {
  932. this.$message.warning("收货总数量与购买不一致!");
  933. this.loading = false;
  934. return;
  935. }
  936. }
  937. this.loading = false;
  938. let res = await asyncRequest.consultorder(model);
  939. this.loading = false;
  940. if (res && res.code === 0) {
  941. this.$notify.success({
  942. title: "下单成功!",
  943. message: "",
  944. });
  945. this.showModelThis = false;
  946. // 刷新
  947. this.$emit("refresh");
  948. } else if (res && res.code >= 100 && res.code <= 104) {
  949. await this.logout();
  950. } else {
  951. this.$message.warning(res.message);
  952. }
  953. } else {
  954. console.log("error submit!!");
  955. return false;
  956. }
  957. });
  958. },
  959. //图片上传成功
  960. async UploadSuccessEventproof_url(data) {
  961. const { url } = data;
  962. if (url === "noToken") {
  963. await this.logout();
  964. } else {
  965. this.img_url = url;
  966. this.set_proof_url();
  967. this.$message.success("图片上传成功!");
  968. }
  969. },
  970. //图片上传失败
  971. UploadErrorEventproof_url(res) {
  972. if (res !== "break") {
  973. this.set_proof_url();
  974. this.$message.error("图片上传失败!");
  975. }
  976. },
  977. //判断图片规格
  978. beforeAvatarUpload(file) {
  979. let isJPG = false;
  980. if (
  981. file.type === "image/jpg" ||
  982. file.type === "image/png" ||
  983. file.type === "image/jpeg"
  984. ) {
  985. isJPG = true;
  986. }
  987. const isLt2M = file.size / 1024 / 1024 < 1;
  988. if (!isJPG) {
  989. this.$message.error("图片格式不正确!");
  990. }
  991. if (!isLt2M) {
  992. this.$message.error("图片大小不能超过 1MB!");
  993. }
  994. return isJPG && isLt2M;
  995. },
  996. //视频上传成功
  997. async UploadSuccessVideoproof_url(data) {
  998. const { url } = data;
  999. if (url === "noToken") {
  1000. await this.logout();
  1001. } else {
  1002. this.video_url = url;
  1003. this.set_proof_url();
  1004. this.$message.success("视频上传成功!");
  1005. }
  1006. },
  1007. //视频上传失败
  1008. UploadErrorVideoproof_url(res) {
  1009. if (res !== "break") {
  1010. this.set_proof_url();
  1011. this.$message.error("视频上传失败!");
  1012. }
  1013. },
  1014. //判断视频规格
  1015. beforeVideoUpload(file) {
  1016. let isJPG = false;
  1017. if (file.type === "video/mp4" || file.type === "video/avi") {
  1018. isJPG = true;
  1019. }
  1020. const isLt2M = file.size / 1024 / 1024 < 10;
  1021. if (!isJPG) {
  1022. this.$message.error("视频格式不正确!");
  1023. }
  1024. if (!isLt2M) {
  1025. this.$message.error("视频大小不能超过 10MB!");
  1026. }
  1027. return isJPG && isLt2M;
  1028. },
  1029. // 其他文件上传成功
  1030. async UploadSuccessOtherproof_url(data) {
  1031. const { url } = data;
  1032. if (url === "noToken") {
  1033. await this.logout();
  1034. } else {
  1035. this.other_url = url;
  1036. this.set_proof_url();
  1037. this.$message.success("文件成功!");
  1038. }
  1039. },
  1040. //其他文件上传失败
  1041. UploadErrorOtherproof_url(res) {
  1042. if (res !== "break") {
  1043. this.set_proof_url();
  1044. this.$message.error("文件上传失败!");
  1045. }
  1046. },
  1047. //判断其他文件规格
  1048. beforeOtherUpload(file) {
  1049. console.log(file);
  1050. let isJPG = false;
  1051. if (
  1052. file.type === "application/vnd.ms-excel" ||
  1053. file.type ===
  1054. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
  1055. file.type === "application/pdf" ||
  1056. file.type === "application/x-zip-compressed"
  1057. ) {
  1058. isJPG = true;
  1059. }
  1060. let name = file.name;
  1061. let list = name.split(".");
  1062. if (list[list.length - 1] === "rar" || list[list.length - 1] === "7z") {
  1063. isJPG = true;
  1064. }
  1065. const isLt2M = file.size / 1024 / 1024 < 5;
  1066. if (!isJPG) {
  1067. this.$message.error("文件格式不正确!");
  1068. }
  1069. if (!isLt2M) {
  1070. this.$message.error("文件大小不能超过 5MB!");
  1071. }
  1072. return isJPG && isLt2M;
  1073. },
  1074. deleteUrl(type) {
  1075. switch (type) {
  1076. case "1":
  1077. this.video_url = "";
  1078. break;
  1079. case "2":
  1080. this.img_url = "";
  1081. break;
  1082. case "3":
  1083. this.other_url = "";
  1084. break;
  1085. default:
  1086. this.video_url = "";
  1087. }
  1088. this.set_proof_url();
  1089. },
  1090. set_proof_url() {
  1091. const { proof_type } = this.ruleForm;
  1092. switch (proof_type) {
  1093. case "1":
  1094. this.ruleForm.proof_url = this.video_url;
  1095. break;
  1096. case "2":
  1097. this.ruleForm.proof_url = this.img_url;
  1098. break;
  1099. case "3":
  1100. this.ruleForm.proof_url = this.other_url;
  1101. break;
  1102. default:
  1103. this.ruleForm.proof_url = this.video_url;
  1104. }
  1105. this.$refs.ruleForm.validateField("proof_url");
  1106. },
  1107. },
  1108. };
  1109. </script>
  1110. <style lang="scss" scoped>
  1111. // .capitalClaim {
  1112. .excelUploadBox {
  1113. position: relative;
  1114. width: 100%;
  1115. height: 120px;
  1116. line-height: 120px;
  1117. box-sizing: border-box;
  1118. &:hover {
  1119. cursor: pointer;
  1120. }
  1121. .el-icon-receiving {
  1122. width: 100%;
  1123. text-align: center;
  1124. height: 50px;
  1125. display: block;
  1126. font-size: 32px;
  1127. line-height: 90px;
  1128. color: #d3d4d6;
  1129. }
  1130. .boxM {
  1131. width: 100%;
  1132. display: block;
  1133. text-align: center;
  1134. line-height: 65px;
  1135. height: 60px;
  1136. color: #909399;
  1137. }
  1138. }
  1139. .excelUpload {
  1140. top: 0;
  1141. left: 0;
  1142. position: absolute;
  1143. z-index: 2;
  1144. width: 100%;
  1145. height: 120px;
  1146. line-height: 120px;
  1147. box-sizing: border-box;
  1148. }
  1149. .excelUploadRes {
  1150. width: 100%;
  1151. height: 120px;
  1152. line-height: 120px;
  1153. box-sizing: border-box;
  1154. i {
  1155. width: 55px;
  1156. height: 120px;
  1157. line-height: 120px;
  1158. text-align: center;
  1159. font-size: 20px;
  1160. &.fl {
  1161. padding-left: 16px;
  1162. }
  1163. &.fr {
  1164. padding-right: 16px;
  1165. &:hover {
  1166. cursor: pointer;
  1167. }
  1168. }
  1169. }
  1170. span {
  1171. width: 386px;
  1172. line-height: 16px;
  1173. margin: 52px 0 0 0;
  1174. font-size: 16px;
  1175. }
  1176. }
  1177. // }
  1178. </style>