addDialog.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <template>
  2. <ele-modal custom-class="ele-dialog-form long-dialog-form" :centered="true" :append-to-body="true"
  3. :visible.sync="visible" :close-on-click-modal="false" width="60%" @close="cancel" :title="title"
  4. :fullscreen="fullscreen">
  5. <template slot="title">
  6. <modalTitle :title="title" @setFullscreen="fullscreen = !fullscreen">
  7. </modalTitle>
  8. </template>
  9. <headerTitle title="基本信息"></headerTitle>
  10. <el-form label-width="120px" ref="form" :model="form" :rules="rules" class="el-form-box">
  11. <el-row>
  12. <el-col :span="8">
  13. <el-form-item label="商品名称:" prop="goodsName">
  14. <el-input placeholder="请输入" v-model="form.goodsName" maxlength="50"></el-input>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="8">
  18. <el-form-item label="商品分类:" prop="categoryLevelId">
  19. <SelectTree :data="gList" placeholder="请选择商品分类" v-model="form.categoryLevelId" />
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="8">
  23. <el-form-item label="商机编码:" prop="goodsCode">
  24. <el-input disabled="true" v-model="form.goodsCode" maxlength="50"></el-input>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="24">
  28. <el-form-item label="商品图片:">
  29. <ImgUpload ref="imgUploadRef" v-model="form.backgroundImgs" />
  30. </el-form-item>
  31. </el-col>
  32. <!-- <el-col :span="8">
  33. <el-form-item label="产品名称:" prop="productName">
  34. <el-input disabled="true" v-model="form.productName" maxlength="50"></el-input>
  35. </el-form-item>
  36. </el-col>
  37. <el-col :span="8">
  38. <el-form-item label="产品类型:" prop="productCategoryName">
  39. <el-input disabled="true" v-model="form.productCategoryName" maxlength="50"></el-input>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="8">
  43. <el-form-item label="产品编码:" prop="productCode">
  44. <el-input disabled="true" v-model="form.productCode" maxlength="50"></el-input>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="属性类型:" prop="produceType">
  49. <el-input disabled="true" v-model="form.produceType" maxlength="50"></el-input>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="8">
  53. <el-form-item label="仓库名称:" prop="warehouseId">
  54. <el-select
  55. v-model="form.warehouseId"
  56. placeholder="请选择"
  57. width="100%"
  58. @change="warehouseChange"
  59. >
  60. <el-option
  61. v-for="item in form.warehouseList"
  62. :key="item.warehouseId"
  63. :label="item.warehouseName"
  64. :value="item.warehouseId"
  65. >
  66. </el-option>
  67. </el-select>
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="8">
  71. <el-form-item label="库存:" prop="warehouseNum">
  72. <el-input disabled="true" v-model="form.warehouseNum" maxlength="50"></el-input>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="8">
  76. <el-form-item label="计量单位:" prop="measuringUnit">
  77. <el-input disabled="true" v-model="form.measuringUnit" maxlength="50"></el-input>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="8">
  81. <el-form-item label="重量单位:" prop="weightUnit">
  82. <el-input disabled="true" v-model="form.weightUnit" maxlength="50"></el-input>
  83. </el-form-item>
  84. </el-col> -->
  85. </el-row>
  86. <BIZproductList
  87. ref="BIZproductListRef"
  88. classType="1"
  89. :isGetInventoryTotal="true"
  90. @changeParent="changeParentBiz"
  91. ></BIZproductList>
  92. </el-form>
  93. <headerTitle title="产品" v-show="!isUpdate"></headerTitle>
  94. <el-form v-show="!isUpdate" label-width="120px" class="el-form-box">
  95. <el-button
  96. size="small"
  97. type="primary"
  98. icon="el-icon-plus"
  99. class="ele-btn-icon"
  100. @click="handParent()"
  101. >
  102. 选择产品
  103. </el-button>
  104. <el-row>
  105. <el-col :span="8">
  106. <el-form-item label="产品名称:" >
  107. <el-input disabled="true" v-model="form.productName" maxlength="50"></el-input>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="8">
  111. <el-form-item label="产品类型:">
  112. <el-input disabled="true" v-model="form.productCategoryName" maxlength="50"></el-input>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="8">
  116. <el-form-item label="产品编码:">
  117. <el-input disabled="true" v-model="form.productCode" maxlength="50"></el-input>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="8">
  121. <el-form-item label="属性类型:">
  122. <el-input disabled="true" v-model="form.produceType" maxlength="50"></el-input>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="8">
  126. <el-form-item label="仓库名称:">
  127. <el-select
  128. v-model="form.warehouseId"
  129. placeholder="请选择"
  130. width="100%"
  131. @change="warehouseChange"
  132. >
  133. <el-option
  134. v-for="item in form.warehouseList"
  135. :key="item.warehouseId"
  136. :label="item.warehouseName"
  137. :value="item.warehouseId"
  138. >
  139. </el-option>
  140. </el-select>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="8">
  144. <el-form-item label="库存:">
  145. <el-input disabled="true" v-model="form.warehouseNum" maxlength="50"></el-input>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="8">
  149. <el-form-item label="计量单位:">
  150. <el-input disabled="true" v-model="form.measuringUnit" maxlength="50"></el-input>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="8">
  154. <el-form-item label="重量单位:">
  155. <el-input disabled="true" v-model="form.weightUnit" maxlength="50"></el-input>
  156. </el-form-item>
  157. </el-col>
  158. </el-row>
  159. <BIZproductList
  160. ref="BIZproductListRef"
  161. classType="1"
  162. :isGetInventoryTotal="true"
  163. @changeParent="changeParentBiz"
  164. ></BIZproductList>
  165. </el-form>
  166. <headerTitle title="价格"></headerTitle>
  167. <ProductTable ref="inventoryTable" />
  168. <template slot="footer">
  169. <el-button type="primary" @click="save">保存</el-button>
  170. <el-button @click="cancel">返回</el-button>
  171. </template>
  172. </ele-modal>
  173. </template>
  174. <script>
  175. import BIZproductList from '@/BIZComponents/product-list.vue';
  176. import SelectTree from './selectTree.vue';
  177. import modalTitle from '@/BIZComponents/modalTitle.vue';
  178. import dictMixins from '@/mixins/dictMixins';
  179. import ProductTable from './productTable.vue';
  180. import { saveGoods } from '@/api/goodsManage/index';
  181. import { getTreeByPid, getPcTreeByPids } from '@/api/classifyManage';
  182. import { getByCode } from '@/api/system/dictionary-data';
  183. import { copyObj } from '@/utils/util';
  184. import {
  185. getWarehouseOutStock,
  186. getIdWarehouseList
  187. } from '@/api/saleManage/saleorder';
  188. import { lbjtList } from '@/enum/dict.js';
  189. import { getCode } from '@/api/login/index';
  190. import ImgUpload from './imgUpload.vue';
  191. import { getGoodsById, updateGoods } from '@/api/goodsManage/index'
  192. export default {
  193. components: {
  194. ProductTable,
  195. modalTitle,
  196. SelectTree,
  197. BIZproductList,
  198. ImgUpload
  199. },
  200. mixins: [dictMixins],
  201. data() {
  202. const formDef = {
  203. id: '',//商品id
  204. categoryLevelId: '',//商品分类
  205. goodsName:'',//商品名称
  206. goodsCode:'',//商品编码
  207. backgroundImgs: "",//商品图片
  208. categoryId: '',//产品id
  209. productName: '',//产品名称
  210. productCategoryName: '',//产品类型
  211. productCode: '',//产品编码
  212. produceType: '',//属性类型
  213. warehouseId: '',//仓库名称
  214. warehouseNum:'',//库存
  215. measuringUnit: '',//计量单位
  216. weightUnit: '',//重量单位
  217. warehouseList:[],//仓库
  218. imagesFileIds: '',
  219. children:[],//价格数组
  220. };
  221. return {
  222. // form:{
  223. // id: '',//产品id
  224. // productName: '',//产品名称
  225. // productCategoryName: '',//产品类型
  226. // productCode: '',//产品编码
  227. // produceType: '',//属性类型
  228. // warehouseId: '',//仓库名称
  229. // warehouseNum:'',//库存
  230. // measuringUnit: '',//计量单位
  231. // weightUnit: '',//重量单位
  232. // warehouseList:[],//仓库
  233. // },
  234. title: '',
  235. visible: false,
  236. fullscreen: false,
  237. form: copyObj(formDef),
  238. // 提交状态
  239. loading: false,
  240. // 是否是修改
  241. isUpdate: false,
  242. gList: [], //商品分类
  243. rules: {
  244. categoryLevelId: [
  245. { required: true, message: '请选择商品分类', trigger: 'change' }
  246. ],
  247. goodsName: [
  248. { required: true, message: '请输入商品名称', trigger: 'blur' }
  249. ],
  250. goodsCode: [
  251. { required: true, message: '请输入商品编码', trigger: 'blur' }
  252. ],
  253. }
  254. };
  255. },
  256. created() {
  257. this.getTreeData();
  258. this.getByCode('goods_price_type'); //获取商品类型字典
  259. },
  260. methods: {
  261. //打开弹出框
  262. async open(type, row, contactCategoryId) {
  263. // this.$refs.inventoryTable.resetTable()
  264. this.form.categoryLevelId = contactCategoryId;
  265. this.title = type === 'add' ? '新增' : '修改';
  266. this.visible = true;
  267. if (type == 'add') {
  268. this.isUpdate = false;
  269. } else {
  270. this.isUpdate = true;
  271. }
  272. if (type === 'editGoodsInfo') {
  273. this.getGoodsById(row.id);
  274. }
  275. },
  276. //获取详情数据
  277. async getGoodsById(id) {
  278. let res = await getGoodsById(id);
  279. this.form = res;
  280. let goodsImgItem = {id: res.imagesFileIds,url:window.location.origin + '/api/main/file/getFile?objectName=' + res.imagesPaths,status: 'done'}
  281. this.form.backgroundImgs = goodsImgItem;
  282. this.$refs.imgUploadRef.putValue(goodsImgItem);
  283. this.$refs.inventoryTable.putTableList(res.children);
  284. },
  285. //查询商品分类
  286. async getTreeData() {
  287. const res = await getTreeByPid('1789827921908150274');
  288. if (res?.code === '0') {
  289. this.gList = res.data;
  290. }
  291. },
  292. //查询商品价格字典
  293. async getByCode(code) {
  294. const res = await getByCode(code);
  295. if (res?.code === '0') {
  296. this.goodsTypeList = res.data;
  297. }
  298. },
  299. //库存计算
  300. async warehouseChange(e) {
  301. const warehouseOutStock = await getWarehouseOutStock({
  302. warehouseId: e,
  303. code: this.form.productCode
  304. });
  305. this.form.warehouseNum = warehouseOutStock || 0
  306. },
  307. //选择产品
  308. handParent() {
  309. this.$refs.BIZproductListRef.open('', 1);
  310. },
  311. changeParentBiz(obj = [], idx) {
  312. this.getGoodsCode('goods_code')
  313. obj.forEach(async (item, index) => {
  314. this.form.categoryId = item.id;
  315. this.form.productName = item.name
  316. this.form.productCategoryName = item.categoryLevelPath;
  317. this.form.productCode = item.code;
  318. this.form.produceType = lbjtList[item.componentAttribute].toString();
  319. this.form.warehouseId = item.warehouseId;
  320. this.form.measuringUnit = item.measuringUnit;
  321. this.form.weightUnit = item.weightUnit;
  322. this.form.warehouseList = await getIdWarehouseList({ categoryId: item.id });
  323. })
  324. },
  325. //提交
  326. async save() {
  327. try {
  328. if (this.form.categoryId === '' && this.$message.error('请选择产品')) return;
  329. await this.getValidate();
  330. // 表单验证通过,执行保存操作
  331. let commitData = this.$refs?.inventoryTable?.getTableValue() || [];
  332. if (commitData.length < 1) {
  333. return
  334. }
  335. let comitDatasource = {};
  336. const { categoryLevelId, goodsName, goodsCode, categoryId, backgroundImgs, id } = this.form;
  337. comitDatasource['categoryId'] = categoryId;
  338. comitDatasource['categoryLevelId'] = categoryLevelId;
  339. comitDatasource['goodsCode'] = goodsCode;
  340. comitDatasource['goodsName'] = goodsName;
  341. comitDatasource['imagesFileIds'] = backgroundImgs[0]?.id;
  342. comitDatasource['priceList'] = commitData;
  343. console.log('comitDatasource',comitDatasource);
  344. this.loading = true;
  345. var res = {}
  346. if (!this.isUpdate) {
  347. res = await saveGoods(comitDatasource);
  348. } else {
  349. comitDatasource['id'] = id
  350. res = await updateGoods(comitDatasource);
  351. }
  352. if (res?.code === '0') {
  353. this.$message.success('操作成功');
  354. this.cancel();
  355. this.$emit('done');
  356. }
  357. } catch (error) {
  358. this.loading = false;
  359. }
  360. },
  361. //查询商品编码
  362. async getGoodsCode(code) {
  363. this.form.goodsCode = await getCode(code);
  364. },
  365. cancel() {
  366. this.$nextTick(() => {
  367. this.$refs.inventoryTable.putTableList([]);
  368. this.$refs.imgUploadRef.putValue();
  369. // 重置表单验证状态
  370. // 关闭后,销毁所有的表单数据
  371. this.form = {}
  372. this.visible = false;
  373. });
  374. },
  375. getValidate() {
  376. //开始表单校验
  377. return Promise.all([
  378. new Promise((resolve, reject) => {
  379. this.$refs.form.validate((valid) => {
  380. if (!valid) {
  381. reject(false);
  382. } else {
  383. resolve(true);
  384. }
  385. });
  386. }),
  387. new Promise((resolve, reject) => {
  388. this.$refs.inventoryTable.validateForm((valid) => {
  389. if (!valid) {
  390. reject(false);
  391. } else {
  392. resolve(true);
  393. }
  394. });
  395. }),
  396. ]);
  397. }
  398. }
  399. };
  400. </script>
  401. <style lang="scss" scoped>
  402. .el-form-item {
  403. margin-bottom: 20px !important;
  404. }
  405. .el-form-item__error {
  406. display: block !important;
  407. color: red;
  408. padding-top: 4px;
  409. }
  410. </style>