buyGoodModal.vue 41 KB

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