addEdit.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <template>
  2. <el-dialog
  3. v-loading="loading"
  4. :title="title"
  5. :center="true"
  6. align="left"
  7. top="8vh"
  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. @close="showModelThis = false"
  15. >
  16. <el-card style="margin-top: -20px">
  17. <el-row :gutter="10">
  18. <el-col :span="24">
  19. <el-form
  20. ref="ruleForm"
  21. :model="ruleForm"
  22. status-icon
  23. :size="'mini'"
  24. :rules="rulesThis"
  25. label-width="100px"
  26. class="demo-ruleForm"
  27. >
  28. <div style="padding: 0 0 12px 0">
  29. <el-divider content-position="center">仓库信息</el-divider>
  30. </div>
  31. <el-row>
  32. <el-col
  33. :span="12"
  34. ><el-form-item
  35. label-width="140px"
  36. label="仓库所在业务公司"
  37. prop="companyNo"
  38. >
  39. <search-work-company
  40. :value="ruleForm.companyNo"
  41. :placeholder="'业务公司'"
  42. :disabled="isDetail || isUpdate"
  43. :size="'mini'"
  44. :is-detail="false"
  45. @searchChange="companyNosearchChange"
  46. />
  47. </el-form-item>
  48. </el-col>
  49. <!-- <el-col :span="12"
  50. ><el-form-item
  51. label="仓库所在公司"
  52. prop="supplierNo"
  53. label-width="120px"
  54. style="width: 100%"
  55. >
  56. <search-supplier
  57. :value="ruleForm.supplierNo"
  58. :names="supplier_name"
  59. :is-detail="id !== 'add'"
  60. :size="'mini'"
  61. :disabled="isDetail"
  62. :placeholder="'仓库公司名称'"
  63. @searchChange="supplierChange"
  64. />
  65. </el-form-item>
  66. </el-col> -->
  67. <el-col :span="12">
  68. <el-form-item label="仓库名称" prop="name">
  69. <el-input
  70. v-model="ruleForm.name"
  71. placeholder="仓库名称"
  72. filterable
  73. :disabled="isDetail"
  74. maxlength="50"
  75. clearable
  76. />
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item label="仓库类型" prop="wsmtype">
  81. <el-select
  82. v-model="ruleForm.wsmtype"
  83. style="width: 100%"
  84. :disabled="isDetail || isUpdate"
  85. placeholder="仓库类型"
  86. >
  87. <el-option
  88. v-for="item in options"
  89. :key="item.value"
  90. :label="item.label"
  91. :value="item.value"
  92. />
  93. </el-select>
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="12">
  97. <el-form-item label="仓库负责人" prop="contactor_id" style="width: 100%">
  98. <search-account
  99. :value="ruleForm.contactor_id"
  100. :placeholder="'仓库负责人'"
  101. :is-detail="id !== 'add'"
  102. :disabled="isDetail"
  103. :size="'mini'"
  104. :names="accountNames"
  105. @searchChange="accountChange"
  106. /> </el-form-item></el-col>
  107. <el-col :span="12">
  108. <el-form-item label="负责人电话" prop="mobile">
  109. <el-input
  110. v-model="ruleForm.mobile"
  111. placeholder="联系人电话"
  112. maxlength="11"
  113. clearable
  114. :disabled="isDetail"
  115. /> </el-form-item></el-col>
  116. <el-col :span="12">
  117. <el-form-item
  118. label="仓库所在省/市/区"
  119. prop="addr_code"
  120. label-width="140px"
  121. >
  122. <select-area
  123. :placeholder="'仓库所在省/市/区'"
  124. :value="ruleForm.addr_code"
  125. :is-detail="id !== 'add'"
  126. :size="'mini'"
  127. :disabled="isDetail"
  128. @selectChange="selectAreaAddr_code"
  129. />
  130. </el-form-item>
  131. </el-col>
  132. <el-col :span="12">
  133. <el-form-item label="仓库所在详细地址" prop="addr" label-width="140px">
  134. <el-input
  135. v-model="ruleForm.addr"
  136. placeholder="仓库所在详细地址"
  137. maxlength="100"
  138. clearable
  139. :disabled="isDetail"
  140. />
  141. </el-form-item>
  142. </el-col>
  143. </el-row>
  144. <div style="padding: 0 0 12px 0">
  145. <el-divider content-position="center">收发货信息</el-divider>
  146. </div>
  147. <el-row>
  148. <el-col :span="8">
  149. <el-form-item label="联系人" prop="wsm_name" label-width="68px">
  150. <el-input
  151. v-model="ruleForm.wsm_name"
  152. placeholder="联系人"
  153. maxlength="20"
  154. :disabled="isDetail"
  155. clearable
  156. /> </el-form-item></el-col>
  157. <el-col :span="8">
  158. <el-form-item label="职位" prop="position" label-width="55px">
  159. <el-input
  160. v-model="ruleForm.position"
  161. placeholder="职位"
  162. maxlength="20"
  163. :disabled="isDetail"
  164. clearable
  165. /> </el-form-item></el-col>
  166. <el-col :span="8">
  167. <el-form-item label="电话" prop="wsm_mobile" label-width="55px">
  168. <el-input
  169. v-model="ruleForm.wsm_mobile"
  170. placeholder="电话"
  171. maxlength="11"
  172. :disabled="isDetail"
  173. clearable
  174. /> </el-form-item></el-col>
  175. </el-row>
  176. <el-row>
  177. <el-col :span="12">
  178. <el-form-item
  179. label="收发货省/市/区"
  180. prop="addrs_code"
  181. label-width="121px"
  182. >
  183. <select-area
  184. :is-detail="id !== 'add'"
  185. :disabled="isDetail"
  186. :size="'mini'"
  187. :value="ruleForm.addrs_code"
  188. :placeholder="'收发货省/市/区'"
  189. @selectChange="selectAreaAddrs_code"
  190. /> </el-form-item></el-col>
  191. <el-col :span="12">
  192. <el-form-item label="收发货详细地址" prop="wsm_addr" label-width="126px">
  193. <el-input
  194. v-model="ruleForm.wsm_addr"
  195. placeholder="收发货详细地址"
  196. maxlength="100"
  197. :disabled="isDetail"
  198. clearable
  199. /> </el-form-item></el-col>
  200. </el-row>
  201. </el-form>
  202. </el-col>
  203. <el-col :span="24" style="text-align: right">
  204. <el-button
  205. v-if="!isDetail"
  206. type="primary"
  207. :size="'mini'"
  208. @click="submitForm"
  209. >保 存
  210. </el-button>
  211. <el-button :size="'mini'" @click="showModelThis = false">{{
  212. isDetail ? "关 闭" : "取 消"
  213. }}</el-button>
  214. </el-col>
  215. </el-row>
  216. </el-card>
  217. </el-dialog>
  218. </template>
  219. <script>
  220. import asyncRequest from '@/apis/service/serviceParam/storeSet'
  221. import resToken from '@/mixins/resToken'
  222. import { isMobile, isSpecialSymbol, hasSpace, isAddr } from '@/utils/validate'
  223. import { mapGetters } from 'vuex'
  224. export default {
  225. name: 'StoreSet',
  226. mixins: [resToken],
  227. props: ['showModel', 'id', 'isDetail'],
  228. computed: {
  229. isUpdate() {
  230. return this.id !== 'add' && !this.isDetail
  231. },
  232. ...mapGetters(['business_companyNo'])
  233. },
  234. data() {
  235. const validatemobile = (rule, value, callback) => {
  236. if (value === '') {
  237. callback(new Error('联系方式不能为空!'))
  238. } else {
  239. if (!isMobile(value)) {
  240. callback(new Error('联系方式格式不正确!'))
  241. } else {
  242. callback()
  243. }
  244. }
  245. }
  246. const validatewsmmobile = (rule, value, callback) => {
  247. if (value === '') {
  248. callback(new Error('联系方式不能为空!'))
  249. } else {
  250. if (!isMobile(value)) {
  251. callback(new Error('联系方式格式不正确!'))
  252. } else {
  253. callback()
  254. }
  255. }
  256. }
  257. const validateAddr = (rule, value, callback) => {
  258. if (value === '') {
  259. callback(new Error('详细地址不能为空!'))
  260. } else {
  261. if (hasSpace(value)) {
  262. callback(new Error('不能出现/回车/换行符!'))
  263. } else if (isSpecialSymbol(value)) {
  264. callback(new Error('不能使用英文特殊字符!'))
  265. } else if (isAddr(value)) {
  266. callback()
  267. } else {
  268. callback(new Error('详细地址填写不规范!'))
  269. }
  270. }
  271. }
  272. return {
  273. supplier_name: '',
  274. accountNames: '',
  275. loading: false,
  276. title: '添加仓库',
  277. showModelThis: this.showModel,
  278. options: [
  279. // {
  280. // value: "1",
  281. // label: "系统仓",
  282. // },
  283. // {
  284. // value: "2",
  285. // label: "虚拟仓",
  286. // },
  287. // {
  288. // value: "3",
  289. // label: "自建仓",
  290. // },
  291. {
  292. value: '5',
  293. label: '销售仓'
  294. },
  295. {
  296. value: '4',
  297. label: '次品仓'
  298. }
  299. ],
  300. ruleForm: {
  301. companyNo: '',
  302. name: '', // 仓库名称
  303. // supplierNo: [], //供应商编码
  304. wsmtype: '', // 仓库类型 目前随便填
  305. addr_code: [], // 仓库省市区
  306. addr: '', // 仓库详细地址
  307. contactor_id: [], // 仓库联系人
  308. mobile: '', // 仓库联系方式
  309. position: '', // 联系人职位 目前随便填
  310. wsm_name: '', // 收发货联系人
  311. wsm_mobile: '', // 收发货联系方式
  312. wsm_addr: '', // 收发货地址详细
  313. addrs_code: [] // 收发货省市区
  314. },
  315. rulesThis: this.rules,
  316. rules: {
  317. name: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }],
  318. position: [{ required: true, message: '联系人职位不能为空', trigger: 'blur' }],
  319. wsmtype: [{ required: true, message: '请选择仓库类型', trigger: 'change' }],
  320. companyNo: [
  321. {
  322. required: true,
  323. message: '业务公司不能为空',
  324. trigger: 'change'
  325. }
  326. ],
  327. // supplierNo: [
  328. // {
  329. // type: "array",
  330. // required: true,
  331. // message: "供应商公司",
  332. // trigger: "change",
  333. // },
  334. // ],
  335. addr_code: [
  336. {
  337. type: 'array',
  338. required: true,
  339. message: '仓库所在省/市/区',
  340. trigger: 'change'
  341. }
  342. ],
  343. addr: [{ required: true, validator: validateAddr, trigger: 'blur' }],
  344. contactor_id: [
  345. {
  346. required: true,
  347. type: 'array',
  348. message: '仓库负责人',
  349. trigger: 'change'
  350. }
  351. ],
  352. mobile: [
  353. {
  354. required: true,
  355. validator: validatemobile,
  356. trigger: 'blur'
  357. }
  358. ],
  359. wsm_name: [
  360. { required: true, message: '收发货联系人', trigger: 'blur' },
  361. {
  362. min: 1,
  363. max: 20,
  364. message: '长度在 1 到 20 个字符',
  365. trigger: 'blur'
  366. }
  367. ],
  368. wsm_mobile: [
  369. {
  370. required: true,
  371. validator: validatewsmmobile,
  372. trigger: 'blur'
  373. }
  374. ],
  375. addrs_code: [
  376. {
  377. type: 'array',
  378. required: true,
  379. message: '收发货所在省/市/区',
  380. trigger: 'change'
  381. }
  382. ],
  383. wsm_addr: [
  384. { required: true, message: '收发货详细地址', trigger: 'blur' },
  385. {
  386. min: 1,
  387. max: 100,
  388. message: '长度在 1 到 100 个字符',
  389. trigger: 'blur'
  390. }
  391. ]
  392. }
  393. }
  394. },
  395. watch: {
  396. showModel: function(val) {
  397. this.showModelThis = val
  398. if (val) {
  399. this.initForm()
  400. }
  401. },
  402. showModelThis(val) {
  403. if (!val) {
  404. this.$emit('cancel')
  405. }
  406. }
  407. },
  408. methods: {
  409. // 业务公司选择
  410. async companyNosearchChange(e) {
  411. const { id, code, label } = e
  412. this.ruleForm.companyNo = code || ''
  413. this.$refs.ruleForm.validateField('companyNo')
  414. },
  415. // 供应商公司选择
  416. supplierChange(e) {
  417. if (e && e.id) {
  418. this.ruleForm.supplierNo = [e.code] // 供应商编码
  419. } else {
  420. this.ruleForm.supplierNo = []
  421. }
  422. this.$refs.ruleForm.validateField('supplierNo')
  423. },
  424. // 仓库省市区
  425. selectAreaAddr_code(e) {
  426. this.ruleForm.addr_code = e
  427. this.$refs.ruleForm.validateField('addr_code')
  428. },
  429. // 收发货省市区
  430. selectAreaAddrs_code(e) {
  431. this.ruleForm.addrs_code = e
  432. this.$refs.ruleForm.validateField('addrs_code')
  433. },
  434. // 负责人选择
  435. accountChange(e) {
  436. if (e && e.id) {
  437. this.ruleForm.contactor_id = [e.id]
  438. } else {
  439. this.ruleForm.contactor_id = []
  440. }
  441. this.$refs.ruleForm.validateField('contactor_id')
  442. },
  443. async initForm() {
  444. this.supplier_name = ''
  445. this.loading = true
  446. if (this.id === 'add') {
  447. this.title = '新建仓库'
  448. this.rulesThis = this.rules
  449. await this.resetForm()
  450. } else {
  451. if (this.isDetail) {
  452. this.title = '仓库详情'
  453. this.rulesThis = {}
  454. } else {
  455. this.title = '修改仓库'
  456. this.rulesThis = this.rules
  457. }
  458. await this.resetForm()
  459. await this.initData()
  460. }
  461. this.loading = false
  462. },
  463. async initData() {
  464. const res = await asyncRequest.detail({ id: this.id })
  465. if (res && res.code === 0 && res.data) {
  466. const {
  467. addr,
  468. addr_code,
  469. addrs_code,
  470. contactor,
  471. contactor_name,
  472. mobile,
  473. name,
  474. // supplierNo,
  475. supplier_name,
  476. wsm_addr,
  477. wsm_code,
  478. wsm_mobile,
  479. wsm_name,
  480. companyNo,
  481. position,
  482. wsm_type
  483. } = res.data
  484. this.supplier_name = supplier_name
  485. this.accountNames = contactor_name
  486. this.ruleForm = {
  487. companyNo: companyNo || this.business_companyNo || '',
  488. name: name, // 仓库名称
  489. // supplierNo: [supplierNo], //供应商编码
  490. wsmtype: wsm_type || '', // 仓库类型 目前随便填
  491. addr_code: this.getCode(addr_code), // 仓库省市区
  492. addr: addr, // 仓库详细地址
  493. contactor_id: contactor ? [contactor] : [], // 仓库联系人
  494. mobile: mobile, // 仓库联系方式
  495. position: position || '', // 联系人职位 目前随便填
  496. wsm_type: '', // 目前随便填
  497. wsm_name: wsm_name, // 收发货联系人
  498. wsm_mobile: wsm_mobile, // 收发货联系方式
  499. wsm_addr: wsm_addr, // 收发货地址详细
  500. addrs_code: this.getCode(addrs_code) // 收发货省市区
  501. }
  502. console.log(this.ruleForm)
  503. // this.ruleForm = res.data;
  504. // this.ruleForm.role_id = this.ruleForm.role;
  505. } else if (res && res.code >= 100 && res.code <= 104) {
  506. await this.logout()
  507. } else {
  508. this.$message.warning(res.message)
  509. }
  510. },
  511. async resetForm() {
  512. // 重置
  513. await this.$nextTick(() => {
  514. if (this.$refs.ruleForm) {
  515. this.$refs.ruleForm.resetFields()
  516. this.$refs.ruleForm.clearValidate()
  517. this.supplier_name = ''
  518. this.accountNames = ''
  519. this.ruleForm = {
  520. companyNo: '',
  521. name: '', // 仓库名称
  522. // supplierNo: [], //供应商编码
  523. wsmtype: '', // 仓库类型 目前随便填
  524. addr_code: [], // 仓库省市区
  525. addr: '', // 仓库详细地址
  526. contactor_id: [], // 仓库联系人
  527. mobile: '', // 仓库联系方式
  528. position: '', // 联系人职位 目前随便填
  529. // wsm_type: "", //目前随便填
  530. wsm_name: '', // 收发货联系人
  531. wsm_mobile: '', // 收发货联系方式
  532. wsm_addr: '', // 收发货地址详细
  533. addrs_code: [] // 收发货省市区
  534. }
  535. }
  536. })
  537. },
  538. setCode(list) {
  539. const model = {
  540. provice_code: list[0],
  541. city_code: list[1],
  542. area_code: list[2]
  543. }
  544. return model
  545. },
  546. getCode(obj) {
  547. const arr = []
  548. arr.push(obj.provice_code)
  549. arr.push(obj.city_code)
  550. arr.push(obj.area_code)
  551. return arr
  552. },
  553. getId(list) {
  554. const arr = JSON.parse(JSON.stringify(list))
  555. return arr.join(',')
  556. },
  557. async submitForm() {
  558. await this.$refs.ruleForm.validate(async(valid) => {
  559. if (valid) {
  560. if (this.loading) {
  561. return
  562. }
  563. this.loading = true
  564. const {
  565. name,
  566. // supplierNo,
  567. addr_code,
  568. addr,
  569. contactor_id,
  570. mobile,
  571. wsm_name,
  572. wsm_mobile,
  573. wsm_addr,
  574. addrs_code,
  575. companyNo,
  576. position,
  577. wsmtype
  578. } = JSON.parse(JSON.stringify(this.ruleForm))
  579. const model = {
  580. id: this.id,
  581. companyNo,
  582. name,
  583. // supplierNo: this.getId(supplierNo),
  584. addr_code: this.setCode(addr_code),
  585. addr,
  586. contactor_id: this.getId(contactor_id),
  587. mobile,
  588. wsm_name,
  589. wsm_mobile,
  590. wsm_addr,
  591. addrs_code: this.setCode(addrs_code),
  592. position,
  593. // wsm_type: "", //目前随便填
  594. wsmtype
  595. }
  596. console.log(model)
  597. let res = {}
  598. if (this.id === 'add') {
  599. delete model['id']
  600. res = await asyncRequest.add(model)
  601. } else {
  602. res = await asyncRequest.update(model)
  603. }
  604. this.loading = false
  605. if (res && res.code === 0) {
  606. const title = this.id === 'add' ? '添加成功' : '修改成功'
  607. this.$notify.success({
  608. title,
  609. message: ''
  610. })
  611. this.showModelThis = false
  612. // 刷新
  613. this.$emit('refresh')
  614. } else if (res && res.code >= 100 && res.code <= 104) {
  615. await this.logout()
  616. } else {
  617. this.$message.warning(res.message)
  618. }
  619. } else {
  620. console.log('error submit!!')
  621. return false
  622. }
  623. })
  624. }
  625. }
  626. }
  627. </script>
  628. <style lang="scss" scoped>
  629. .storeSet {
  630. }
  631. </style>