edit-dialog.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <ele-modal :visible.sync="visible" v-if="visible" :title="title" width="80%" @close="cancel">
  3. <headerTitle title="基本信息"></headerTitle>
  4. <el-form label-width="100px">
  5. <el-row>
  6. <el-col :span="8">
  7. <el-form-item label="BOM编码" prop="code">
  8. <el-input
  9. placeholder="自动生成"
  10. disabled
  11. v-model="formData.code"
  12. ></el-input>
  13. </el-form-item>
  14. </el-col>
  15. <el-col :span="8">
  16. <el-form-item label="BOM名称" prop="name">
  17. <el-input placeholder="请输入" v-model="formData.name"></el-input>
  18. </el-form-item>
  19. </el-col>
  20. <el-col :span="8">
  21. <el-form-item label="所属工厂" prop="factoryId">
  22. <factorySelect v-model="formData.factoryId" />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="8">
  26. <el-form-item label="产品编码" prop="categoryCode">
  27. <el-input
  28. placeholder="请输入"
  29. v-model="formData.categoryCode"
  30. @click.native="selectProd"
  31. ></el-input>
  32. </el-form-item>
  33. </el-col>
  34. <el-col :span="8">
  35. <el-form-item label="产品名称" prop="categoryName">
  36. <el-input
  37. placeholder="请选择"
  38. disabled
  39. v-model="formData.categoryName"
  40. ></el-input>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="8">
  44. <el-form-item label="分类层级" prop="categoryType">
  45. <el-select
  46. v-model="formData.categoryType"
  47. placeholder="请选择"
  48. class="w100"
  49. >
  50. <el-option
  51. v-for="item in categoryList"
  52. :key="item.value"
  53. :label="item.label"
  54. :value="item.value"
  55. ></el-option>
  56. </el-select>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="8">
  60. <el-form-item label="基本数量" prop="baseCount">
  61. <el-row >
  62. <el-col :span="16">
  63. <el-input
  64. placeholder="请输入"
  65. v-model.number="formData.baseCount"
  66. >
  67. </el-input
  68. ></el-col>
  69. <el-col :span="2">&nbsp;</el-col>
  70. <el-col :span="6"
  71. ><DictSelection
  72. dictName="计量单位"
  73. v-model="formData.baseCountUnit"
  74. /></el-col>
  75. </el-row>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :span="8">
  79. <el-form-item label="状态" prop="status">
  80. <el-select
  81. :disabled="title == '新建'"
  82. clearable
  83. v-model="formData.status"
  84. placeholder="请选择"
  85. class="w100"
  86. >
  87. <el-option
  88. v-for="item in Object.entries(statusOpt)"
  89. :key="item[0]"
  90. :label="item[1]"
  91. :value="item[0]"
  92. ></el-option>
  93. </el-select>
  94. </el-form-item>
  95. </el-col>
  96. </el-row>
  97. </el-form>
  98. <ele-pro-table
  99. ref="table"
  100. :columns="columns"
  101. :datasource="tableData"
  102. height="calc(100vh - 350px)"
  103. :need-page="false"
  104. >
  105. <!-- 表头工具栏 -->
  106. <template v-slot:toolbar>
  107. <el-button type="primary" @click="add">添加</el-button>
  108. </template>
  109. <template v-slot:action="{ $index }">
  110. <el-link type="primary" @click="handleDel($index)">删除</el-link>
  111. </template>
  112. <template v-slot:subCode="{ row }">
  113. <el-input v-model="row.subCode" placeholder="请输入"></el-input>
  114. </template>
  115. <template v-slot:unit="{ row }">
  116. <DictSelection dictName="计量单位" v-model="row.unit"></DictSelection>
  117. </template>
  118. <template v-slot:count="{ row }">
  119. <el-input
  120. v-model="row.count"
  121. placeholder="请输入"
  122. @input="
  123. (value) =>
  124. (row.count = value.replace(
  125. /^(-)*(\d+)\.(\d\d\d\d\d\d).*$/,
  126. '$1$2.$3'
  127. ))
  128. "
  129. ></el-input>
  130. </template>
  131. <template v-slot:categoryName="{ row }">
  132. <el-input
  133. :value="row.categoryName"
  134. placeholder="请选择"
  135. @click.native="categorySelect(row)"
  136. ></el-input>
  137. </template>
  138. </ele-pro-table>
  139. <div slot="footer" class="footer">
  140. <el-button type="primary" @click="save">保存</el-button>
  141. <el-button @click="cancel">返回</el-button>
  142. </div>
  143. <materialDialog ref="materialDialogRef" />
  144. <productDialog ref="productDialogRef" />
  145. </ele-modal>
  146. </template>
  147. <script>
  148. import materialDialog from '@/components/SelectDialog/materialDialog';
  149. import productDialog from '@/components/SelectDialog/productDialog';
  150. import factorySelect from '@/components/CommomSelect/factory-select.vue';
  151. import { getCode } from '@/api/codeManagement/index.js';
  152. export default {
  153. components: { materialDialog, factorySelect, productDialog },
  154. props: {
  155. statusOpt: Object
  156. },
  157. data () {
  158. return {
  159. visible: false,
  160. title: '',
  161. row: {},
  162. formData: {
  163. code: '',
  164. name: '',
  165. factoryId: '',
  166. categoryCode: '',
  167. categoryId: '',
  168. categoryName: '',
  169. categoryType: '',
  170. baseCount: '',
  171. baseCountUnit: '',
  172. status: '-1'
  173. },
  174. categoryList: [
  175. {
  176. value: '1',
  177. label: '产品'
  178. },
  179. {
  180. value: '2',
  181. label: '部件'
  182. },
  183. {
  184. value: '3',
  185. label: '零件'
  186. }
  187. ],
  188. tableData: [],
  189. columns: [
  190. {
  191. type: 'index',
  192. width: 55,
  193. align: 'center'
  194. },
  195. {
  196. label: '子项编号',
  197. prop: 'subCode',
  198. slot: 'subCode',
  199. action: 'subCode'
  200. },
  201. {
  202. label: '物料名称',
  203. prop: 'categoryName',
  204. slot: 'categoryName',
  205. action: 'categoryName'
  206. },
  207. {
  208. label: '物料编码',
  209. prop: 'categoryId'
  210. },
  211. {
  212. label: '牌号',
  213. prop: 'brandNum'
  214. },
  215. {
  216. label: '型号',
  217. prop: 'modelType'
  218. },
  219. {
  220. label: '需量(子)',
  221. slot: 'count',
  222. action: 'count'
  223. },
  224. {
  225. label: '单位',
  226. slot: 'unit',
  227. action: 'unit'
  228. },
  229. {
  230. action: 'action',
  231. slot: 'action',
  232. label: '操作'
  233. }
  234. ]
  235. };
  236. },
  237. methods: {
  238. open (type, row) {
  239. this.title = type;
  240. this.row = row;
  241. this.visible = true;
  242. if (type == '新建') {
  243. this._getCode();
  244. }
  245. },
  246. add () {
  247. let subCode = '0010';
  248. if (this.tableData.length) {
  249. let max = Math.max(...this.tableData.map((i) => i.subCode)) + 10 + '';
  250. if (max.length < 4) {
  251. max = new Array(4 - max.length).fill('0').join('') + max;
  252. }
  253. subCode = max.substring(0, max.length - 1) + '0';
  254. }
  255. this.tableData.push({
  256. subCode,
  257. categoryId: '',
  258. categoryName: '',
  259. brandNum: '',
  260. count: '',
  261. modelType: '',
  262. unit: ''
  263. });
  264. },
  265. async _getCode () {
  266. const code = await getCode('bom_code');
  267. this.formData.code = code;
  268. },
  269. selectProd () {
  270. this.$refs.productDialogRef.open(this.formData, (res) => {
  271. this.formData.categoryCode = res.code;
  272. this.formData.categoryId = res.id;
  273. this.formData.categoryName = res.name;
  274. console.log(res);
  275. });
  276. },
  277. categorySelect (row) {
  278. this.$refs.materialDialogRef.open(row, (res) => {
  279. row.categoryName = res.name;
  280. row.categoryId = res.id;
  281. row.unit = res.measuringUnit;
  282. row.modelType = res.modelType;
  283. row.brandNum = res.brandNum;
  284. });
  285. },
  286. save () {},
  287. handleDel (index) {
  288. this.tableData.splice(index, 1);
  289. },
  290. cancel () {
  291. this.visible = false
  292. }
  293. }
  294. };
  295. </script>