WarehouseEdit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <template>
  2. <el-dialog
  3. :visible.sync="visible"
  4. :title="`${type}仓库`"
  5. :before-close="cancel"
  6. width="500px"
  7. >
  8. <el-form
  9. v-loading="loadingVis"
  10. :model="formData"
  11. :rules="rules"
  12. ref="formRef"
  13. label-width="100px"
  14. >
  15. <el-form-item label="仓库编码" prop="code">
  16. <el-input
  17. v-model="formData.code"
  18. :disabled="type != '新建'"
  19. placeholder="请输入"
  20. size="small"
  21. ></el-input>
  22. </el-form-item>
  23. <el-form-item label="仓库名称" size="small" prop="name">
  24. <el-input
  25. v-model="formData.name"
  26. placeholder="限16个文字"
  27. maxlength="16"
  28. ></el-input>
  29. </el-form-item>
  30. <el-form-item label="仓库类型" prop="inventoryType">
  31. <!-- <DictSelection
  32. dictName="仓库类型"
  33. clearable
  34. v-model="formData.inventoryType"
  35. /> -->
  36. <el-select
  37. filterable
  38. size="small"
  39. class="w100"
  40. v-model="formData.inventoryType"
  41. placeholder="请选择"
  42. @visible-change="changeInventoryType"
  43. >
  44. <el-option
  45. v-for="item in inventoryTypeList"
  46. :key="item.id"
  47. :label="item.name"
  48. :value="item.id"
  49. >
  50. </el-option>
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item label="所属工厂" prop="factoryId">
  54. <el-select
  55. filterable
  56. size="small"
  57. class="w100"
  58. v-model="formData.factoryId"
  59. placeholder="请选择"
  60. >
  61. <el-option
  62. v-for="item in factoryList"
  63. :key="item.id"
  64. :label="item.name"
  65. :value="item.id"
  66. @click.native="
  67. () => (
  68. (formData.factoryName = item.name),
  69. (formData.factoryCodefactoryCode = item.code)
  70. )
  71. "
  72. >
  73. </el-option>
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item label="权属部门" prop="departmentId">
  77. <DeptSelect v-model="formData.departmentId" @input="nodeClick" />
  78. </el-form-item>
  79. <el-form-item label="仓管员" prop="ownerId">
  80. <el-select
  81. filterable
  82. class="w100"
  83. size="small"
  84. v-model="formData.ownerId"
  85. placeholder="请选择"
  86. @change="changeOwner"
  87. >
  88. <el-option
  89. v-for="item in userList"
  90. :key="item.id"
  91. :label="item.name"
  92. :value="item.id"
  93. >
  94. </el-option>
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="联系方式" prop="contact">
  98. <el-input
  99. v-model="formData.contact"
  100. placeholder="请输入"
  101. size="small"
  102. ></el-input>
  103. </el-form-item>
  104. <el-form-item label="仓库位置" prop="location">
  105. <el-cascader
  106. size="small"
  107. class="w100"
  108. v-model="formData.location"
  109. :options="locationOptions"
  110. @change="changeLocation"
  111. ></el-cascader>
  112. </el-form-item>
  113. <el-form-item label="详情地址" prop="address">
  114. <el-input
  115. v-model="formData.address"
  116. placeholder="请输入"
  117. size="small"
  118. @change="$forceUpdate()"
  119. ></el-input>
  120. </el-form-item>
  121. <el-form-item label="备注" prop="remarks">
  122. <el-input
  123. type="textarea"
  124. v-model="formData.remarks"
  125. placeholder="请输入"
  126. size="small"
  127. ></el-input>
  128. </el-form-item>
  129. <el-form-item label="锁库状态" prop="lockStatus">
  130. <el-switch
  131. v-model="formData.lockStatus"
  132. active-text="锁库"
  133. inactive-text="开库"
  134. :active-value="1"
  135. :inactive-value="0"
  136. ></el-switch>
  137. </el-form-item>
  138. <el-form-item label="状态" prop="status">
  139. <el-switch
  140. v-model="formData.status"
  141. active-text="开"
  142. inactive-text="关"
  143. :active-value="1"
  144. :inactive-value="0"
  145. ></el-switch>
  146. </el-form-item>
  147. </el-form>
  148. <el-divider></el-divider>
  149. <div slot="footer">
  150. <el-button type="primary" plain @click="cancel">取消</el-button>
  151. <el-button type="primary" @click="handleSave" :loading="loading"
  152. >确定</el-button
  153. >
  154. </div>
  155. </el-dialog>
  156. </template>
  157. <script>
  158. import warehouseDefinition from '@/api/warehouseManagement/warehouseDefinition';
  159. // import selectTree from '@/components/selectTree';
  160. import DeptSelect from '@/components/CommomSelect/new-dept-select.vue';
  161. import city from '@/assets/js/city';
  162. // import user from '@/api/main/user';
  163. export default {
  164. components: { DeptSelect },
  165. data() {
  166. return {
  167. visible: false,
  168. loading: false,
  169. formData: {
  170. code: '',
  171. name: '',
  172. inventoryType: '',
  173. inventoryName: '',
  174. remarks: '',
  175. factoryId: '',
  176. status: 1,
  177. lockStatus: 0,
  178. ownerId: '',
  179. departmentId: '',
  180. contact: '',
  181. },
  182. rules: {
  183. code: [
  184. { required: true, message: '请输入仓库编码', trigger: 'blur' }
  185. ],
  186. name: [
  187. { required: true, message: '请输入仓库名称', trigger: 'blur' }
  188. ],
  189. inventoryType: [
  190. { required: true, message: '请选择仓库类型', trigger: 'blur' }
  191. ],
  192. factoryId: [
  193. { required: true, message: '请选择工厂名称', trigger: 'blur' }
  194. ],
  195. departmentId: [
  196. { required: true, message: '请选择权属部门', trigger: 'change' }
  197. ],
  198. ownerId: [
  199. { required: true, message: '请选择权属人', trigger: 'change' }
  200. ]
  201. // status: [
  202. // { required: true, message: '请选择仓库状态', trigger: 'blur' }
  203. // ]
  204. },
  205. type: '新建',
  206. userList: [],
  207. deptList: [], //部门集合
  208. inventoryTypeList: [],
  209. factoryList: [], //工厂集合
  210. locationOptions: city,
  211. loadingVis: false
  212. };
  213. },
  214. watch: {
  215. visible: {
  216. handler(val) {
  217. if (val) {
  218. // this.init();
  219. }
  220. }
  221. },
  222. loadingVis: {
  223. handler(val) {
  224. console.log(val);
  225. if (!val && this.type == '新建') {
  226. this.formData = {
  227. code: '',
  228. name: '',
  229. inventoryType: '',
  230. inventoryName: '',
  231. remarks: '',
  232. factoryId: '',
  233. status: 1,
  234. lockStatus: 0,
  235. ownerId: '',
  236. departmentId: ''
  237. };
  238. }
  239. }
  240. }
  241. },
  242. created() {},
  243. methods: {
  244. async open(type, row) {
  245. console.log(type);
  246. this.type = type;
  247. this.visible = true;
  248. this.init();
  249. if (type === '修改') {
  250. console.log(1);
  251. this.loadingVis = true;
  252. this.$nextTick(async () => {
  253. setTimeout(async () => {
  254. const { warehouseVO } = await warehouseDefinition.warehouseDetail(
  255. row.id
  256. );
  257. if (warehouseVO.departmentId) {
  258. let userData = await warehouseDefinition.getUserPage({
  259. groupId: warehouseVO.departmentId,
  260. size: 9999,
  261. pageNum: 1
  262. });
  263. this.userList = userData.list;
  264. }
  265. this.formData = {
  266. ...warehouseVO,
  267. location: [
  268. warehouseVO.province,
  269. warehouseVO.city,
  270. warehouseVO.area
  271. ],
  272. inventoryType: warehouseVO.inventoryType + ''
  273. };
  274. this.loadingVis = false;
  275. }, 2000);
  276. });
  277. } else {
  278. this.formData = {
  279. code: '',
  280. name: '',
  281. inventoryType: '',
  282. inventoryName: '',
  283. remarks: '',
  284. factoryId: '',
  285. status: 1,
  286. lockStatus: 0,
  287. ownerId: '',
  288. departmentId: ''
  289. };
  290. }
  291. // if (type === '新建') {
  292. // let num = 1
  293. // const res = await warehouseList()
  294. // if (res?.success && res.data?.length) {
  295. // num = +res.data[0].code.substr(1) + 1
  296. // }
  297. // this.formData.code = 'A' + pushZero(num)
  298. // }
  299. },
  300. async init() {
  301. // org.tree().then((tree) => {
  302. // if (tree?.success) {
  303. // this.deptList = tree.data;
  304. // }
  305. // });
  306. // const tree = await warehouseDefinition.tree();
  307. // this.deptList = this.$util.toTreeData({
  308. // data: tree,
  309. // idField: 'id',
  310. // parentIdField: 'parentId'
  311. // });
  312. //获取工厂车间列表
  313. const res = await warehouseDefinition.getFactoryarea({
  314. pageNum: 1,
  315. size: 9999,
  316. type: 1
  317. });
  318. // let data = org.factorys({ status: true });
  319. this.factoryList = res.list;
  320. const res2 = await warehouseDefinition.getTreeByGroup({ type: 2 });
  321. this.inventoryTypeList = res2;
  322. },
  323. changeInventoryType(val) {
  324. console.log(val, '1');
  325. let data = this.inventoryTypeList.find((item) => {
  326. return item.id == this.formData.inventoryType;
  327. });
  328. console.log(data);
  329. this.formData.inventoryName = data?.name;
  330. console.log(this.formData.inventoryName);
  331. },
  332. handleSave() {
  333. this.$refs.formRef.validate(async (value) => {
  334. if (value) {
  335. const params = Object.assign(this.formData);
  336. // if (params.location?.length) {
  337. // const [province, city, area] = params.location;
  338. // Object.assign(params, {
  339. // province,
  340. // city,
  341. // area
  342. // });
  343. // }
  344. // delete params.location;
  345. // console.log(params);
  346. this.loading = true;
  347. const res = await warehouseDefinition
  348. .saveOrUpdateWarehouse(params)
  349. .finally(() => (this.loading = false));
  350. if (res.data?.code == '0') {
  351. this.$message.success('保存成功!');
  352. this.$emit('success');
  353. this.cancel();
  354. }
  355. }
  356. });
  357. },
  358. cancel() {
  359. this.$refs.formRef.resetFields();
  360. // this.$refs.tree.clearHandle();
  361. this.visible = false;
  362. },
  363. async nodeClick(id, data) {
  364. // this.formData.departmentCode = data?.code;
  365. this.formData.departmentId = id;
  366. if (data) {
  367. this.formData.departmentName = data.name;
  368. }
  369. this.formData.ownerName = '';
  370. this.formData.ownerId = '';
  371. if (id) {
  372. let userData = await warehouseDefinition.getUserPage({
  373. groupId: id,
  374. size: 9999,
  375. pageNum: 1
  376. });
  377. this.userList = userData.list;
  378. }
  379. },
  380. changeOwner(val) {
  381. this.formData.ownerId = val;
  382. let user = this.userList.find((item) => {
  383. return item.id == val;
  384. });
  385. console.log(user);
  386. this.formData.ownerName = user.name;
  387. this.formData.contact = user.phone;
  388. // this.$nextTick(() => {
  389. // this.$forceUpdate();
  390. // });
  391. // this.$set(this.formData, 'ownerId', val);
  392. // this.$set(
  393. // this.formData,
  394. // 'ownerName',
  395. // this.userList.find((item) => {
  396. // return item.id == val;
  397. // }).name
  398. // );
  399. // console.log(this.formData);
  400. // this.$forceUpdate();
  401. },
  402. changeLocation(val) {
  403. console.log(val, '1');
  404. this.$set(this.formData, 'province', val[0]); //省
  405. this.$set(this.formData, 'city', val[1]); //市
  406. this.$set(this.formData, 'area', val[2]); //区
  407. delete this.formData.location;
  408. }
  409. }
  410. };
  411. </script>
  412. <style lang="scss" scoped>
  413. ::v-deep .el-form {
  414. .el-form-item {
  415. margin-bottom: 20px;
  416. }
  417. }
  418. .el-divider--horizontal {
  419. margin: 0 !important;
  420. }
  421. </style>