InBatchesDialog.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <el-dialog :title="'批次号:' + baseLot.lotCode" v-model="visible" width="1200px" append-to-body draggable @close="close">
  3. <div class="form-container in-batches-dialog">
  4. <el-form ref="lotFormRef" v-loading="loading" class="master-container" :model="baseLot" label-width="130px"
  5. @submit.native.prevent>
  6. <el-row :gutter="20">
  7. <el-col :span="24">
  8. <div>基础信息</div>
  9. <el-divider />
  10. </el-col>
  11. <el-col :span="8">
  12. <el-form-item label="客户简称:" prop="companyAlias">
  13. <div>{{ baseLot.companyAlias }}</div>
  14. </el-form-item>
  15. </el-col>
  16. <el-col :span="8">
  17. <el-form-item label="生产计划单号:" prop="productionPlanNo">
  18. <div>{{ baseLot.productionPlanNo }}</div>
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="8">
  22. <el-form-item label="批次号:" prop="lotCode">
  23. <div>{{ baseLot.lotCode }}</div>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="8">
  27. <el-form-item label="产品描述:" prop="productDescription">
  28. <div>{{ baseLot.productDescription }}</div>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <el-form-item label="图纸版本:" prop="technologyVersion">
  33. <div>{{ baseLot.technologyVersion }}</div>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="8">
  37. <el-form-item label="批次投产量:" prop="productionQuantity">
  38. <div>{{ baseLot.productionQuantity }}</div>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="8">
  42. <el-form-item label="下达日期:" prop="date">
  43. <div>{{ baseLot.issueDate }}</div>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="8">
  47. <el-form-item label="当前工段:">
  48. <div>{{ baseLot.currentDept }}</div>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="8">
  52. <el-form-item label="当前工序投产量:">
  53. <div>{{ baseLot.prodNum }}</div>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="8">
  57. <el-form-item label="工序合格数量:">
  58. <div>{{ baseLot.qualifiedNum }}</div>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="8">
  62. <el-form-item label="当前载具:">
  63. <div>{{ baseLot.carriers.map(v => v.code).join(',') }}</div>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="24">
  67. <div style="display: flex; flex-direction: row;">
  68. <div style="line-height: 32px;">分批信息</div>
  69. <el-form-item label="分批数量">
  70. <el-input-number v-model="baseLot.sparateNum" :controls="false" :min="2" :max="10" step="1"
  71. step-strictly />
  72. </el-form-item>
  73. <el-form-item label-width="20px">
  74. <el-button type="primary" @click="handleNumBlur">计算</el-button>
  75. </el-form-item>
  76. </div>
  77. <el-divider />
  78. <el-row v-for="(e, i) in baseLot.sparateList" :key="i">
  79. <el-col :span="6">
  80. <el-form-item label="分批批次号:">
  81. <el-input disabled v-model="e.lotCode" />
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="5">
  85. <el-form-item label="分批数量:">
  86. <el-input-number v-model="e.lotNumber" :controls="false" />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="5">
  90. <el-form-item label="合格数量:">
  91. <el-input-number v-model="e.qualifiedNum" :controls="false" />
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="8">
  95. <el-form-item label="分批载具:">
  96. <!-- <el-select-v2 v-model="e.carrierSelection"
  97. :disabled="e.id === baseLot.id || baseLot.currentDept == null" multiple filterable
  98. collapse-tags-tooltip collapse-tags clearable :options="carriers" placeholder="请选择载具"
  99. style="width: 100%" /> -->
  100. <el-select v-model="e.carrierSelection" :disabled="e.id === baseLot.id || baseLot.currentDept == null"
  101. multiple filterable remote reserve-keyword placeholder="请选择载具" collapse-tags-tooltip collapse-tags
  102. :remote-method="(arg) => remoteCarriers(arg, e.carriers)" :loading="loadingCarrier"
  103. @change="(arg) => handleCarrierChange(arg, e)">
  104. <el-option v-for="item in carriers" :key="item.value" :label="item.label" :value="item.value" />
  105. </el-select>
  106. </el-form-item>
  107. </el-col>
  108. </el-row>
  109. </el-col>
  110. </el-row>
  111. </el-form>
  112. </div>
  113. <template #footer>
  114. <el-button type="primary" icon="Check" @click="handleSave">确 定</el-button>
  115. <el-button icon="Close" @click="close">取 消</el-button>
  116. </template>
  117. </el-dialog>
  118. </template>
  119. <script setup>
  120. import { getLotInfoForInBatches, listCarriers, saveInBatches } from '@/api/business/lot'
  121. import { toRefs } from 'vue';
  122. // import {}
  123. const { proxy } = getCurrentInstance();
  124. const props = defineProps({
  125. getList: {
  126. type: Function,
  127. default: () => { }
  128. }
  129. })
  130. const { getList } = toRefs(props);
  131. /**工段弹窗变量 */
  132. const total = ref(0)
  133. const baseLot = ref({
  134. carriers: []
  135. })
  136. const selections = ref([]);
  137. const visible = ref(false);
  138. const deptIds = ref([])
  139. const loading = ref(false);
  140. const carriers = ref([])
  141. const loadingCarrier = ref(true)
  142. /**查询对象 */
  143. const data = reactive({
  144. queryParams: {
  145. pageSize: 10,
  146. pageNum: 1,
  147. },
  148. });
  149. const { queryParams } = toRefs(data);
  150. /*********************** 方法区 ****************************/
  151. /**
  152. * 对话框打开 事件
  153. */
  154. function open(data) {
  155. baseLot.value = { ...data, id: data.lotId, carriers: [] }
  156. visible.value = true;
  157. loadLot();
  158. getCarriers()
  159. }
  160. function getCarriers() {
  161. listCarriers({ isAbandoned: 0, pageSize: 200 }).then(res => {
  162. if (res.code === 200) {
  163. carriers.value.push(...res.rows.map(v => ({ value: v.id, label: v.code })))
  164. }
  165. })
  166. }
  167. function remoteCarriers(queryString, choiced) {
  168. loadingCarrier.value = true
  169. listCarriers({ isAbandoned: 0, pageSize: 200, code: queryString != '' ? queryString : null }).then(res => {
  170. if (res.code === 200) {
  171. carriers.value = res.rows.map(v => ({ value: v.id, label: v.code }))
  172. carriers.value.push(...choiced.filter(v => !carriers.value.map(e => e.value).includes(v.id)).map(v => ({ value: v.id, label: v.code })))
  173. } else {
  174. carriers.value = []
  175. carriers.value.push(...choiced)
  176. }
  177. console.log(carriers.value)
  178. loadingCarrier.value = false
  179. })
  180. }
  181. function handleCarrierChange(arg, item) {
  182. item.carriers = carriers.value.filter(v => arg.includes(v.value)).map(v => ({ id: v.value, code: v.label }))
  183. }
  184. function loadLot() {
  185. getLotInfoForInBatches({ id: baseLot.value.id }).then(res => {
  186. if (res.code === 200) {
  187. baseLot.value.issueDate = res.data.issueDate
  188. baseLot.value.prodNum = res.data.prodNum
  189. baseLot.value.currentDept = res.data.currentDept
  190. baseLot.value.sparateList = []
  191. baseLot.value.qualifiedNum = res.data.qualifiedNum
  192. baseLot.value.carriers = res.data.carriers
  193. baseLot.value.sparateNum = 0
  194. baseLot.value.latestLotCode = res.data.latestLotCode
  195. baseLot.value.productId = res.data.productId
  196. baseLot.value.isAmend = res.data.isAmend
  197. baseLot.value.isWasteRecycling = res.data.isWasteRecycling
  198. baseLot.value.requisitionDepartmentName = res.data.requisitionDepartmentName
  199. baseLot.value.requisitionDepartmentId = res.data.requisitionDepartmentId
  200. baseLot.value.splitCount = res.data.splitCount
  201. baseLot.value.fromCount = res.data.fromCount
  202. carriers.value.push(...res.data.carriers.map(v => ({ value: v.id, label: v.code })))
  203. }
  204. })
  205. }
  206. /**
  207. * 对话框关闭 事件
  208. */
  209. function close() {
  210. visible.value = false;
  211. }
  212. /**
  213. * 列表checkbox列选择 事件
  214. */
  215. function handleSelectionChange(selection) {
  216. selections.value = selection;
  217. }
  218. /** 多选事件 */
  219. function handleMultipleSelected() {
  220. if (multipleSelected.value) {
  221. multipleSelected.value(selections.value);
  222. }
  223. close();
  224. }
  225. function handleSave() {
  226. // console.log(baseLot.value)
  227. // 保存时判断下分批数量和是否等于投产数量。不等要提示一下
  228. let num = 0
  229. let qualified = 0
  230. baseLot.value.sparateList.forEach(e => {
  231. num += e.lotNumber
  232. qualified += e.qualifiedNum
  233. })
  234. const prodNum = !!baseLot.value.prodNum ? baseLot.value.prodNum : baseLot.value.productionQuantity
  235. const qualifiedNum = !!baseLot.value.qualifiedNum ? baseLot.value.qualifiedNum : 0
  236. if (num != prodNum) {
  237. proxy.$message({
  238. type: 'warning',
  239. message: '分批数量需等于总投入数量'
  240. })
  241. return
  242. }
  243. if (qualified != qualifiedNum) {
  244. proxy.$message({
  245. type: 'warning',
  246. message: '分批合格数量需等于总合格数量'
  247. })
  248. return
  249. }
  250. // const saveDate = { ...baseLot.value, sparateList: baseLot.value.sparateList.map(v => ({ ...v, carriers: v.id === baseLot.id ? v.carriers : v.carrierSelection.map(e => ({ id: e })) })) }
  251. // const saveDate = { ...baseLot.value }
  252. const saveDate = { id: baseLot.value.id, isAmend: baseLot.value.isAmend, isWasteRecycling: baseLot.value.isWasteRecycling, requisitionDepartmentName: baseLot.value.requisitionDepartmentName, requisitionDepartmentId: baseLot.value.requisitionDepartmentId, lotCode: baseLot.value.lotCode, splitCount: baseLot.value.splitCount, fromCount: baseLot.value.fromCount, sparateList: baseLot.value.sparateList.map(v => ({ id: v.id, fromId: v.fromId, lotNumber: v.lotNumber, qualifiedNum: v.qualifiedNum, productionPlanDetailId: v.productionPlanDetailId, technologicalProcessId: v.technologicalProcessId, isAmend: baseLot.value.isAmend, isWasteRecycling: baseLot.value.isWasteRecycling, requisitionDepartmentName: baseLot.value.requisitionDepartmentName, requisitionDepartmentId: baseLot.value.requisitionDepartmentId, technologyVersion: v.technologyVersion, productId: v.productId, productionQuantity: v.lotNumber, lotCode: v.lotCode, carriers: v.id === baseLot.id ? v.carriers : v.carrierSelection.map(e => ({ id: e })), splitCount: v.splitCount })) }
  253. // 提交分批结果
  254. saveInBatches(saveDate).then(res => {
  255. if (res.code === 200) {
  256. proxy.$message({
  257. type: 'success',
  258. message: '分批成功'
  259. })
  260. close()
  261. getList.value()
  262. } else {
  263. proxy.$message({
  264. type: 'error',
  265. message: res.message
  266. })
  267. }
  268. })
  269. }
  270. function handleNumBlur() {
  271. // 分批数量修改
  272. baseLot.value.sparateList = []
  273. const prodNum = !!baseLot.value.prodNum ? baseLot.value.prodNum : baseLot.value.productionQuantity
  274. const qualifiedNum = !!baseLot.value.qualifiedNum ? baseLot.value.qualifiedNum : 0
  275. const arg = baseLot.value.sparateNum
  276. const latestLotCode = baseLot.value.latestLotCode
  277. // debugger
  278. if ((Number(latestLotCode.charAt(latestLotCode.length - 1)) + arg - 1) > 9) {
  279. proxy.$message({
  280. type: 'warning',
  281. message: '总分批书里不能大于9'
  282. })
  283. return
  284. }
  285. for (let i = 0; i < arg; i++) {
  286. const item = { ...baseLot.value }
  287. if (i === 0) {
  288. // 第一条
  289. item.lotNumber = Math.ceil(prodNum / arg)
  290. item.qualifiedNum = Math.ceil(qualifiedNum / arg)
  291. item.carrierSelection = baseLot.value.carriers.map(v => v.id)
  292. } else if ((i + 1) === arg) {
  293. item.lotNumber = prodNum - (Math.ceil(prodNum / arg) * (arg - 1))
  294. item.lotCode = baseLot.value.latestLotCode.slice(0, -1) + (Number(latestLotCode.charAt(latestLotCode.length - 1)) + i)
  295. item.qualifiedNum = qualifiedNum - (Math.ceil(qualifiedNum / arg) * (arg - 1))
  296. item.fromId = baseLot.value.id
  297. item.id = null
  298. item.lotId = null
  299. item.last = 0
  300. item.carrierSelection = []
  301. } else {
  302. item.id = null
  303. item.lotId = null
  304. item.fromId = baseLot.value.id
  305. item.lotCode = baseLot.value.latestLotCode.slice(0, -1) + (Number(latestLotCode.charAt(latestLotCode.length - 1)) + i)
  306. item.lotNumber = Math.ceil(prodNum / arg)
  307. item.qualifiedNum = Math.ceil(qualifiedNum / arg)
  308. item.fromId = baseLot.value.id
  309. item.last = 0
  310. item.carrierSelection = []
  311. }
  312. baseLot.value.sparateList.push(item)
  313. }
  314. }
  315. defineExpose({
  316. open,
  317. });
  318. </script>
  319. <style>
  320. .in-batches-dialog .el-form-item--default .el-form-item__content {
  321. line-height: 32px;
  322. display: inline-block;
  323. }
  324. </style>