index.vue 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348
  1. <template>
  2. <div class="app-container" style="width: 100%;">
  3. <el-tabs type="border-card" @tab-click="tabClick" v-model="selectedWorkshop">
  4. <!--南车间-->
  5. <el-tab-pane label="南车间计划" name="南车间">
  6. <!--表格-->
  7. <el-table
  8. :data="tableData"
  9. ref="tableRef"
  10. :span-method="spanMethod2">
  11. <el-table-column prop="machineId" fixed label="机台号" header-align="center" align="center" width="111px" ></el-table-column>
  12. <el-table-column prop="productType" fixed label="产品类别" header-align="center" align="center" width="111.2px"></el-table-column>
  13. <el-table-column label="在机产品" header-align="center" >
  14. <el-table-column prop="productTypeName" fixed label="产品类型" header-align="center" align="center" width="111.2px"></el-table-column>
  15. <el-table-column prop="currentColorCode" label="色号" header-align="center" width="90px" align="center"></el-table-column>
  16. <el-table-column prop="currentSpecification" label="规格" header-align="center" width="90px" align="center"></el-table-column>
  17. <el-table-column prop="currentLotNumber" label="批号" header-align="center" width="90px" align="center"></el-table-column>
  18. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" width="90px" align="center"></el-table-column>
  19. <el-table-column prop="startTime" label="上机时间" header-align="center" width="90px" align="center"></el-table-column>
  20. <el-table-column prop="plannedEndTime" label="下机时间" header-align="center" width="90px" align="center"></el-table-column>
  21. </el-table-column>
  22. <!-- <el-table-column label="待上机产品" header-align="center" align="center">-->
  23. <!-- <el-table-column prop="djCurrentColorCode" label="色号" header-align="center" align="center"></el-table-column>-->
  24. <!-- <el-table-column prop="djCurrentSpecification" label="规格" header-align="center" align="center"></el-table-column>-->
  25. <!-- <el-table-column prop="djNumber" label="数量" header-align="center" align="center"></el-table-column>-->
  26. <!-- <el-table-column prop="djCurrentLotNumber" label="原丝批号" header-align="center" align="center"></el-table-column>-->
  27. <!-- </el-table-column>-->
  28. <el-table-column prop="listOfPendingProduction" label="待生产产品列表" header-align="center" align="center" >
  29. <template slot-scope="scope">
  30. <div v-if="scope.row.listOfPendingProduction">
  31. <span v-for="(item, index) in scope.row.listOfPendingProduction.split(',')">
  32. {{ item }},
  33. <br v-if="(index + 1) % 5 === 0 && index !== scope.row.listOfPendingProduction.split(',').length - 1" />
  34. </span>
  35. </div>
  36. </template>
  37. </el-table-column>
  38. <el-table-column fixed="right" label="操作" header-align="center" align="center" width="150px" >
  39. <template slot-scope="scope">
  40. <el-dropdown>
  41. <el-button type="primary">
  42. 操作
  43. <i class="el-icon-arrow-down el-icon--right"></i>
  44. </el-button>
  45. <el-dropdown-menu slot="dropdown">
  46. <el-dropdown-item @click.native.prevent="handleAddPlan(scope.row)">新增计划</el-dropdown-item>
  47. <el-dropdown-item @click.native.prevent="handleEditPlan(scope.row)">修改计划</el-dropdown-item>
  48. <el-dropdown-item @click.native.prevent="handleStopProductionLine(scope.row)">机台状态</el-dropdown-item>
  49. </el-dropdown-menu>
  50. </el-dropdown>
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <!--新增计划弹窗-->
  55. <el-dialog title="南车间新增计划" :visible.sync="nanInsertDialogTableVisible" width="1200px">
  56. <el-table :data="tableData2" @row-click.self="handleRowClick">
  57. <el-table-column prop="productId" label="产品" header-align="center" align="center" width="150px">
  58. <template v-slot:default="scope">
  59. <el-select v-model="scope.row.productId" placeholder="请选择待排产产品" @change="selectedChangeDate(scope.row,scope.row.productId)">
  60. <el-option v-for="product in productsInfo" :key="product.id" :label="product.productName" :value="product.id" ></el-option>
  61. </el-select>
  62. </template>
  63. </el-table-column>
  64. <el-table-column prop="currentColorCode" label="色号" header-align="center" align="center">
  65. <template v-slot:default="scope">
  66. <el-select v-model="scope.row.currentColorCode" filterable placeholder="请选择母粒编码" @change="selectedML(scope.row)">
  67. <el-option
  68. v-for="(item,index) in options"
  69. :key="index"
  70. :label="item.label"
  71. :value="item.value">
  72. </el-option>
  73. </el-select>
  74. <!-- &lt;!&ndash; 如果当前行正在编辑,则显示输入框 &ndash;&gt;-->
  75. <!-- <el-input v-if="scope.row.isEditing" v-model="scope.row.currentColorCode" placeholder="请输入色号" @blur.stop.prevent="handleInputBlur(scope.row)" ></el-input>-->
  76. <!-- &lt;!&ndash; 否则显示普通文本 &ndash;&gt;-->
  77. <!-- <span v-else>{{ scope.row.currentColorCode }}</span>-->
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="currentSpecification" label="规格" header-align="center" align="center">
  81. <template v-slot:default="scope">
  82. <!-- 如果当前行正在编辑,则显示输入框 -->
  83. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentSpecification" placeholder="请输入规格" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  84. <!-- 否则显示普通文本 -->
  85. <span v-else>{{ scope.row.currentSpecification }}</span>
  86. </template>
  87. </el-table-column>
  88. <el-table-column prop="productType" label="产品类别" header-align="center" align="center" width="100px">
  89. <template v-slot:default="scope">
  90. <el-select v-model="scope.row.productType" placeholder="请选择产品类别" >
  91. <el-option v-for="product in productTypeList" :key="product.value" :label="product.lable" :value="product.value" ></el-option>
  92. </el-select>
  93. </template>
  94. </el-table-column>
  95. <el-table-column prop="currentLotNumber" label="批号" header-align="center" align="center">
  96. <template v-slot:default="scope">
  97. <el-input v-if="scope.row.isEditing" :disabled="isDisabled" v-model="scope.row.currentLotNumber" placeholder="请输入批号" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  98. <span v-else>{{ scope.row.currentLotNumber }}</span>
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" align="center">
  102. <template v-slot:default="scope">
  103. <el-input v-if="scope.row.isEditing" v-model="scope.row.currentSpindleCount" placeholder="请输入锭数" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  104. <span v-else>{{ scope.row.currentSpindleCount }}</span>
  105. </template>
  106. </el-table-column>
  107. <el-table-column prop="djNumber" label="数量" header-align="center" align="center">
  108. <template v-slot:default="scope">
  109. <el-input v-if="scope.row.isEditing" v-model="scope.row.number" placeholder="请输入数量" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  110. <span v-else>{{ scope.row.number }}</span>
  111. </template>
  112. </el-table-column>
  113. <el-table-column prop="startTime" label="上机时间" header-align="center" align="center">
  114. <template v-slot:default="scope">
  115. <el-input v-if="scope.row.isEditing" v-model="scope.row.startTime" placeholder="请输入上机时间" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  116. <span v-else>{{ scope.row.startTime }}</span>
  117. </template>
  118. </el-table-column>
  119. <el-table-column prop="plannedEndTime" label="计划下机时间" header-align="center" align="center">
  120. <template v-slot:default="scope">
  121. <el-input v-if="scope.row.isEditing" :ref="'input'+scope.$index" v-model="scope.row.plannedEndTime" placeholder="请输入计划下机时间" @blur="handleInputBlur(scope.row)">></el-input>
  122. <span v-else>{{ scope.row.plannedEndTime }}</span>
  123. </template>
  124. </el-table-column>
  125. <el-table-column prop="planStatus" label="计划状态" header-align="center" align="center" width="100px">
  126. <template v-slot:default="scope">
  127. <el-select v-model="scope.row.planStatus" placeholder="计划状态">
  128. <el-option v-for="stateItem in stateList0" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  129. </el-select>
  130. </template>
  131. </el-table-column>
  132. <el-table-column label="操作">
  133. <template slot-scope="scope">
  134. <el-button
  135. size="mini"
  136. type="danger"
  137. @click.stop.prevent="handleDelete(scope.$index, scope.row)">删除</el-button>
  138. </template>
  139. </el-table-column>
  140. </el-table>
  141. <el-button type="primary" style="width: 100%;margin-top: 30px" @click="addEditableRow">新增计划产品</el-button>
  142. <span slot="footer" class="dialog-footer">
  143. <el-button @click="nanInsertDialogTableVisible = false">取 消</el-button>
  144. <el-button type="primary" @click="addPlanInfo">确 定</el-button>
  145. </span>
  146. </el-dialog>
  147. <!--修改计划弹窗-->
  148. <el-dialog title="修改计划" :visible.sync="nanUpdateDialogTableVisible" width="1400px">
  149. <!--查询条件-->
  150. <el-form ref="form" :model="formData" label-width="80px" :inline="true">
  151. <el-form-item label="产品类别:">
  152. <el-select v-model="formData.productType" placeholder="请选择产品类别">
  153. <el-option v-for="product in productTypeList" :key="product.value" :label="product.lable" :value="product.value" ></el-option>
  154. </el-select>
  155. </el-form-item>
  156. <el-form-item label="计划状态:">
  157. <el-select v-model="formData.planStatus" placeholder="请选择计划状态">
  158. <el-option v-for="stateListItem in stateList2" :key="product.id" :label="stateListItem.name" :value="stateListItem.id" ></el-option>
  159. </el-select>
  160. </el-form-item>
  161. <el-form-item>
  162. <el-button type="primary" @click="onSubmit">查询</el-button>
  163. <el-button @click="reset">重置</el-button>
  164. </el-form-item>
  165. </el-form>
  166. <!--表格-->
  167. <el-table :data="tableData2" @row-click.self="handleRowClick">
  168. <el-table-column prop="productId" label="产品" header-align="center" align="center" width="150px">
  169. <template slot-scope="scope">
  170. {{ getProductChineseName(scope.row.productId) }}
  171. </template>
  172. </el-table-column>
  173. <el-table-column prop="currentColorCode" label="色号" header-align="center" align="center">
  174. <template v-slot:default="scope">
  175. <!-- 如果当前行正在编辑,则显示输入框 -->
  176. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentColorCode" placeholder="请输入色号" @blur.stop.prevent="handleInputBlur(scope.row)" ></el-input>
  177. <!-- 否则显示普通文本 -->
  178. <span v-else>{{ scope.row.currentColorCode }}</span>
  179. </template>
  180. </el-table-column>
  181. <el-table-column prop="currentSpecification" label="规格" header-align="center" align="center">
  182. <template v-slot:default="scope">
  183. <!-- 如果当前行正在编辑,则显示输入框 -->
  184. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentSpecification" placeholder="请输入规格" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  185. <!-- 否则显示普通文本 -->
  186. <span v-else>{{ scope.row.currentSpecification }}</span>
  187. </template>
  188. </el-table-column>
  189. <el-table-column prop="productType" label="产品类别" header-align="center" align="center" width="100px">
  190. <template v-slot:default="scope">
  191. <el-select v-model="scope.row.productType" placeholder="请选择产品类别" >
  192. <el-option v-for="product in productTypeList" :key="product.value" :label="product.lable" :value="product.value" ></el-option>
  193. </el-select>
  194. </template>
  195. </el-table-column>
  196. <el-table-column prop="currentLotNumber" label="批号" header-align="center" align="center">
  197. <template v-slot:default="scope">
  198. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentLotNumber" placeholder="请输入批号" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  199. <span v-else>{{ scope.row.currentLotNumber }}</span>
  200. </template>
  201. </el-table-column>
  202. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" align="center">
  203. <template v-slot:default="scope">
  204. <el-input v-if="scope.row.isEditing" v-model="scope.row.currentSpindleCount" placeholder="请输入锭数" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  205. <span v-else>{{ scope.row.currentSpindleCount }}</span>
  206. </template>
  207. </el-table-column>
  208. <el-table-column prop="number" label="数量" header-align="center" align="center">
  209. <template v-slot:default="scope">
  210. <el-input v-if="scope.row.isEditing" v-model="scope.row.number" placeholder="请输入数量" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  211. <span v-else>{{ scope.row.number }}</span>
  212. </template>
  213. </el-table-column>
  214. <el-table-column prop="startTime" label="上机时间" header-align="center" align="center">
  215. <template v-slot:default="scope">
  216. <el-input v-if="scope.row.isEditing" v-model="scope.row.startTime" placeholder="请输入上机时间" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  217. <span v-else>{{ scope.row.startTime }}</span>
  218. </template>
  219. </el-table-column>
  220. <el-table-column prop="plannedEndTime" label="计划下机时间" header-align="center" align="center">
  221. <template v-slot:default="scope">
  222. <el-input v-if="scope.row.isEditing" :ref="'input'+scope.$index" v-model="scope.row.plannedEndTime" placeholder="请输入计划下机时间" @blur="handleInputBlur(scope.row)">></el-input>
  223. <span v-else>{{ scope.row.plannedEndTime }}</span>
  224. </template>
  225. </el-table-column>
  226. <el-table-column prop="planStatus" label="计划状态" header-align="center" align="center" width="100px">
  227. <template v-slot:default="scope">
  228. <!--上机变停机待机-->
  229. <el-select v-if="scope.row.planStatus==1" v-model="scope.row.planStatus" placeholder="计划状态">
  230. <el-option v-for="stateItem in stateList1" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  231. </el-select>
  232. <!--待机可以上机-->
  233. <el-select v-if="scope.row.planStatus==0" v-model="scope.row.planStatus" placeholder="计划状态" >
  234. <el-option v-for="stateItem in stateList0" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  235. </el-select>
  236. <!--停机变上机-->
  237. <el-select v-if="scope.row.planStatus==2" v-model="scope.row.planStatus" placeholder="计划状态" >
  238. <el-option v-for="stateItem in stateList2" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  239. </el-select>
  240. </template>
  241. </el-table-column>
  242. <el-table-column label="操作" align="center" width="200px">
  243. <template slot-scope="scope">
  244. <el-button
  245. size="mini"
  246. type="danger"
  247. @click.stop.prevent="updateStatus(scope.$index, scope.row)">更新状态</el-button>
  248. <el-button
  249. size="mini"
  250. type="danger"
  251. @click.stop.prevent="deletePlan(scope.$index, scope.row)">删除</el-button>
  252. </template>
  253. </el-table-column>
  254. </el-table>
  255. <!--操作按钮-->
  256. <span slot="footer" class="dialog-footer">
  257. <el-button @click="nanUpdateDialogTableVisible = false">取 消</el-button>
  258. <el-button type="primary" @click="nanUpdateDialogTableVisible = false">确 定</el-button>
  259. </span>
  260. </el-dialog>
  261. </el-tab-pane>
  262. <!--北车间-->
  263. <el-tab-pane label="北车间计划" name="北车间">
  264. <!--表格-->
  265. <el-table
  266. :data="tableData"
  267. ref="tableRef"
  268. :span-method="spanMethod2">
  269. <el-table-column prop="machineId" fixed label="机台号" header-align="center" align="center" width="111px" ></el-table-column>
  270. <el-table-column prop="productType" fixed label="产品类别" header-align="center" align="center" width="111.2px"></el-table-column>
  271. <el-table-column label="在机产品" header-align="center" >
  272. <el-table-column prop="productTypeName" fixed label="产品类型" header-align="center" align="center" width="111.2px"></el-table-column>
  273. <el-table-column prop="currentColorCode" label="色号" header-align="center" width="90px" align="center"></el-table-column>
  274. <el-table-column prop="currentSpecification" label="规格" header-align="center" width="90px" align="center"></el-table-column>
  275. <el-table-column prop="currentLotNumber" label="批号" header-align="center" width="90px" align="center"></el-table-column>
  276. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" width="90px" align="center"></el-table-column>
  277. <el-table-column prop="startTime" label="上机时间" header-align="center" width="90px" align="center"></el-table-column>
  278. <el-table-column prop="plannedEndTime" label="下机时间" header-align="center" width="90px" align="center"></el-table-column>
  279. </el-table-column>
  280. <!-- <el-table-column label="待上机产品" header-align="center" align="center">-->
  281. <!-- <el-table-column prop="djCurrentColorCode" label="色号" header-align="center" align="center"></el-table-column>-->
  282. <!-- <el-table-column prop="djCurrentSpecification" label="规格" header-align="center" align="center"></el-table-column>-->
  283. <!-- <el-table-column prop="djNumber" label="数量" header-align="center" align="center"></el-table-column>-->
  284. <!-- <el-table-column prop="djCurrentLotNumber" label="原丝批号" header-align="center" align="center"></el-table-column>-->
  285. <!-- </el-table-column>-->
  286. <el-table-column prop="listOfPendingProduction" label="待生产产品列表" header-align="center" align="center" >
  287. <template slot-scope="scope">
  288. <div v-if="scope.row.listOfPendingProduction">
  289. <div v-for="(item, index) in scope.row.listOfPendingProduction.split(',')">
  290. {{ item }}
  291. <span v-if="(index + 1) % 5 === 0 && index !== scope.row.listOfPendingProduction.split(',').length - 1">,</span>
  292. <br v-if="(index + 1) % 5 === 0 && index !== scope.row.listOfPendingProduction.split(',').length - 1" />
  293. </div>
  294. </div>
  295. </template>
  296. </el-table-column>
  297. <el-table-column fixed="right" label="操作" header-align="center" align="center" width="150px" >
  298. <template slot-scope="scope">
  299. <el-dropdown>
  300. <el-button type="primary">
  301. 操作
  302. <i class="el-icon-arrow-down el-icon--right"></i>
  303. </el-button>
  304. <el-dropdown-menu slot="dropdown">
  305. <el-dropdown-item @click.native.prevent="handleAddPlan(scope.row)">新增计划</el-dropdown-item>
  306. <el-dropdown-item @click.native.prevent="handleEditPlan(scope.row)">修改计划</el-dropdown-item>
  307. <el-dropdown-item @click.native.prevent="handleStopProductionLine(scope.row)">机台状态</el-dropdown-item>
  308. </el-dropdown-menu>
  309. </el-dropdown>
  310. </template>
  311. </el-table-column>
  312. </el-table>
  313. <!--新增计划弹窗-->
  314. <el-dialog title="北车间新增计划" :visible.sync="beiInsertDialogTableVisible" width="1200px">
  315. <el-table :data="tableData2" @row-click.self="handleRowClick">
  316. <!-- <el-table-column prop="salesmanId" label="业务员" header-align="center" align="center" width="100px">-->
  317. <!-- <template v-slot:default="scope">-->
  318. <!-- <el-select v-model="scope.row.salesmanId" placeholder="请选择业务员" @change="selectedSalesmanItem(scope.row,scope.row.salesmanId)">-->
  319. <!-- <el-option v-for="salesmanItem in salesmanInfo" :key="salesmanItem.saleNo" :label="salesmanItem.salesman" :value="salesmanItem.saleNo" ></el-option>-->
  320. <!-- </el-select>-->
  321. <!-- </template>-->
  322. <!-- </el-table-column>-->
  323. <el-table-column prop="productId" label="产品" header-align="center" align="center" width="150px">
  324. <template v-slot:default="scope">
  325. <el-select v-model="scope.row.productId" placeholder="请选择待排产产品" @change="selectedChangeDate(scope.row,scope.row.productId)">
  326. <el-option v-for="product in productsInfo" :key="product.id" :label="product.productName" :value="product.id" ></el-option>
  327. </el-select>
  328. </template>
  329. </el-table-column>
  330. <el-table-column prop="currentColorCode" label="色号" header-align="center" align="center">
  331. <template v-slot:default="scope">
  332. <el-select v-model="scope.row.currentColorCode" filterable placeholder="请选择母粒编码">
  333. <el-option
  334. v-for="(item,index) in options"
  335. :key="index"
  336. :label="item.label"
  337. :value="item.value">
  338. </el-option>
  339. </el-select>
  340. <!-- &lt;!&ndash; 如果当前行正在编辑,则显示输入框 &ndash;&gt;-->
  341. <!-- <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentColorCode" placeholder="请输入色号" @blur.stop.prevent="handleInputBlur(scope.row)" ></el-input>-->
  342. <!-- &lt;!&ndash; 否则显示普通文本 &ndash;&gt;-->
  343. <!-- <span v-else>{{ scope.row.currentColorCode }}</span>-->
  344. </template>
  345. </el-table-column>
  346. <el-table-column prop="currentSpecification" label="规格" header-align="center" align="center">
  347. <template v-slot:default="scope">
  348. <!-- 如果当前行正在编辑,则显示输入框 -->
  349. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentSpecification" placeholder="请输入规格" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  350. <!-- 否则显示普通文本 -->
  351. <span v-else>{{ scope.row.currentSpecification }}</span>
  352. </template>
  353. </el-table-column>
  354. <el-table-column prop="productType" label="产品类别" header-align="center" align="center" width="100px">
  355. <template v-slot:default="scope">
  356. <el-select v-model="scope.row.productType" placeholder="请选择产品类别" >
  357. <el-option v-for="product in productTypeList" :key="product.value" :label="product.lable" :value="product.value" ></el-option>
  358. </el-select>
  359. </template>
  360. </el-table-column>
  361. <el-table-column prop="currentLotNumber" label="批号" header-align="center" align="center">
  362. <template v-slot:default="scope">
  363. <el-input v-if="scope.row.isEditing" :disabled="isDisabled" v-model="scope.row.currentLotNumber" placeholder="请输入批号" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  364. <span v-else>{{ scope.row.currentLotNumber }}</span>
  365. </template>
  366. </el-table-column>
  367. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" align="center">
  368. <template v-slot:default="scope">
  369. <el-input v-if="scope.row.isEditing" v-model="scope.row.currentSpindleCount" placeholder="请输入锭数" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  370. <span v-else>{{ scope.row.currentSpindleCount }}</span>
  371. </template>
  372. </el-table-column>
  373. <el-table-column prop="number" label="数量" header-align="center" align="center">
  374. <template v-slot:default="scope">
  375. <el-input v-if="scope.row.isEditing" v-model="scope.row.number" placeholder="请输入数量" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  376. <span v-else>{{ scope.row.number }}</span>
  377. </template>
  378. </el-table-column>
  379. <el-table-column prop="startTime" label="上机时间" header-align="center" align="center">
  380. <template v-slot:default="scope">
  381. <el-input v-if="scope.row.isEditing" v-model="scope.row.startTime" placeholder="请输入上机时间" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  382. <span v-else>{{ scope.row.startTime }}</span>
  383. </template>
  384. </el-table-column>
  385. <el-table-column prop="plannedEndTime" label="计划下机时间" header-align="center" align="center">
  386. <template v-slot:default="scope">
  387. <el-input v-if="scope.row.isEditing" :ref="'input'+scope.$index" v-model="scope.row.plannedEndTime" placeholder="请输入计划下机时间" @blur="handleInputBlur(scope.row)">></el-input>
  388. <span v-else>{{ scope.row.plannedEndTime }}</span>
  389. </template>
  390. </el-table-column>
  391. <el-table-column prop="planStatus" label="计划状态" header-align="center" align="center" width="100px">
  392. <template v-slot:default="scope">
  393. <el-select v-model="scope.row.planStatus" placeholder="计划状态" >
  394. <el-option v-for="stateItem in stateList0" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  395. </el-select>
  396. </template>
  397. </el-table-column>
  398. <el-table-column label="操作" >
  399. <template slot-scope="scope">
  400. <el-button
  401. size="mini"
  402. type="danger"
  403. @click.stop.prevent="handleDelete(scope.$index, scope.row)">删除</el-button>
  404. </template>
  405. </el-table-column>
  406. </el-table>
  407. <el-button type="primary" style="width: 100%;margin-top: 30px" @click="addEditableRow">新增计划产品</el-button>
  408. <span slot="footer" class="dialog-footer">
  409. <el-button @click="beiInsertDialogTableVisible = false">取 消</el-button>
  410. <el-button type="primary" @click="addPlanInfo">确 定</el-button>
  411. </span>
  412. </el-dialog>
  413. <!--修改计划弹窗-->
  414. <el-dialog title="北车间修改计划" :visible.sync="beiUpdateDialogTableVisible" width="1200px">
  415. <!--查询条件-->
  416. <el-form ref="form" :model="formData" label-width="80px" :inline="true">
  417. <el-form-item label="产品类别:">
  418. <el-select v-model="formData.productType" placeholder="请选择产品类别">
  419. <el-option v-for="(product,index) in productTypeList" :key="index" :label="product.lable" :value="product.value" ></el-option>
  420. </el-select>
  421. </el-form-item>
  422. <el-form-item label="计划状态:">
  423. <el-select v-model="formData.planStatus" placeholder="请选择计划状态">
  424. <el-option v-for="stateListItem in stateList2" :key="product.id" :label="stateListItem.name" :value="stateListItem.id" ></el-option>
  425. </el-select>
  426. </el-form-item>
  427. <el-form-item>
  428. <el-button type="primary" @click="onSubmit">查询</el-button>
  429. <el-button @click="reset">重置</el-button>
  430. </el-form-item>
  431. </el-form>
  432. <!--表格-->
  433. <el-table :data="tableData2" @row-click.self="handleRowClick">
  434. <el-table-column prop="productId" label="产品" header-align="center" align="center" width="150px">
  435. <template slot-scope="scope">
  436. {{ getProductChineseName(scope.row.productId) }}
  437. </template>
  438. </el-table-column>
  439. <el-table-column prop="currentColorCode" label="色号" header-align="center" align="center">
  440. <template v-slot:default="scope">
  441. <!-- 如果当前行正在编辑,则显示输入框 -->
  442. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentColorCode" placeholder="请输入色号" @blur.stop.prevent="handleInputBlur(scope.row)" ></el-input>
  443. <!-- 否则显示普通文本 -->
  444. <span v-else>{{ scope.row.currentColorCode }}</span>
  445. </template>
  446. </el-table-column>
  447. <el-table-column prop="currentSpecification" label="规格" header-align="center" align="center">
  448. <template v-slot:default="scope">
  449. <!-- 如果当前行正在编辑,则显示输入框 -->
  450. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentSpecification" placeholder="请输入规格" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  451. <!-- 否则显示普通文本 -->
  452. <span v-else>{{ scope.row.currentSpecification }}</span>
  453. </template>
  454. </el-table-column>
  455. <el-table-column prop="productType" label="产品类别" header-align="center" align="center" width="100px">
  456. <template v-slot:default="scope">
  457. <el-select v-model="scope.row.productType" placeholder="请选择产品类别">
  458. <el-option v-for="product in productTypeList" :key="product.value" :label="product.lable" :value="product.value" ></el-option>
  459. </el-select>
  460. </template>
  461. </el-table-column>
  462. <el-table-column prop="currentLotNumber" label="批号" header-align="center" align="center">
  463. <template v-slot:default="scope">
  464. <el-input v-if="scope.row.isEditing" disabled="disabled" v-model="scope.row.currentLotNumber" placeholder="请输入批号" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  465. <span v-else>{{ scope.row.currentLotNumber }}</span>
  466. </template>
  467. </el-table-column>
  468. <el-table-column prop="currentSpindleCount" label="锭数" header-align="center" align="center">
  469. <template v-slot:default="scope">
  470. <el-input v-if="scope.row.isEditing" v-model="scope.row.currentSpindleCount" placeholder="请输入锭数" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  471. <span v-else>{{ scope.row.currentSpindleCount }}</span>
  472. </template>
  473. </el-table-column>
  474. <el-table-column prop="number" label="数量" header-align="center" align="center">
  475. <template v-slot:default="scope">
  476. <el-input v-if="scope.row.isEditing" v-model="scope.row.number" placeholder="请输入数量" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  477. <span v-else>{{ scope.row.number }}</span>
  478. </template>
  479. </el-table-column>
  480. <el-table-column prop="startTime" label="上机时间" header-align="center" align="center">
  481. <template v-slot:default="scope">
  482. <el-input v-if="scope.row.isEditing" v-model="scope.row.startTime" placeholder="请输入上机时间" @blur.stop.prevent="handleInputBlur(scope.row)">></el-input>
  483. <span v-else>{{ scope.row.startTime }}</span>
  484. </template>
  485. </el-table-column>
  486. <el-table-column prop="plannedEndTime" label="计划下机时间" header-align="center" align="center">
  487. <template v-slot:default="scope">
  488. <el-input v-if="scope.row.isEditing" :ref="'input'+scope.$index" v-model="scope.row.plannedEndTime" placeholder="请输入计划下机时间" @blur="handleInputBlur(scope.row)">></el-input>
  489. <span v-else>{{ scope.row.plannedEndTime }}</span>
  490. </template>
  491. </el-table-column>
  492. <el-table-column prop="planStatus" label="计划状态" header-align="center" align="center" width="100px">
  493. <template v-slot:default="scope">
  494. <!--上机变停机待机-->
  495. <el-select v-if="scope.row.planStatus==1" v-model="scope.row.planStatus" placeholder="计划状态" >
  496. <el-option v-for="stateItem in stateList1" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  497. </el-select>
  498. <!--待机可以上机-->
  499. <el-select v-if="scope.row.planStatus==0" v-model="scope.row.planStatus" placeholder="计划状态" >
  500. <el-option v-for="stateItem in stateList0" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  501. </el-select>
  502. <!--停机变上机-->
  503. <el-select v-if="scope.row.planStatus==2" v-model="scope.row.planStatus" placeholder="计划状态" >
  504. <el-option v-for="stateItem in stateList2" :key="stateItem.id" :label="stateItem.name" :value="stateItem.id" ></el-option>
  505. </el-select>
  506. </template>
  507. </el-table-column>
  508. <el-table-column label="操作" align="center" width="200px">
  509. <template slot-scope="scope">
  510. <el-button
  511. size="mini"
  512. type="danger"
  513. @click.stop.prevent="updateStatus(scope.$index, scope.row)">更新状态</el-button>
  514. <el-button
  515. size="mini"
  516. type="danger"
  517. @click.stop.prevent="deletePlan(scope.$index, scope.row)">删除</el-button>
  518. </template>
  519. </el-table-column>
  520. </el-table>
  521. <span slot="footer" class="dialog-footer">
  522. <el-button @click="beiUpdateDialogTableVisible = false">取 消</el-button>
  523. <el-button type="primary" @click="beiUpdateDialogTableVisible = false">确 定</el-button>
  524. </span>
  525. </el-dialog>
  526. </el-tab-pane>
  527. <!--停机弹窗-->
  528. <el-dialog title="修改机台状态" :visible.sync="modifyMachineStatus" width="500px">
  529. <el-form :model="modifyMachineStatusFrom" ref="modifyMachineStatusFrom" label-width="100px" class="demo-ruleForm">
  530. <el-form-item label="机台状态" prop="type">
  531. <el-checkbox-group v-model="modifyMachineStatusFrom.type">
  532. <el-checkbox label="1" name="type">A面停机</el-checkbox>
  533. <el-checkbox label="2" name="type">B面停机</el-checkbox>
  534. </el-checkbox-group>
  535. </el-form-item>
  536. <el-form-item>
  537. <el-button type="primary" @click="confirmStopProductionLine">确定</el-button>
  538. <el-button @click="tjqx">取消</el-button>
  539. </el-form-item>
  540. </el-form>
  541. </el-dialog>
  542. </el-tabs>
  543. </div>
  544. </template>
  545. <script>
  546. import {
  547. ammunitionPlanInfo,
  548. getProductsInfo,
  549. removeBombLoadingPlan,
  550. getMaterielInfo,
  551. addMaterielInfo,
  552. getProductsAll,
  553. getAllPlanListByMachineId,
  554. getAllPlanListByProductTypeAndStatus,
  555. updatePlanOne,
  556. whetherTheFeederIsShutDown,
  557. updateLineStates,
  558. getIsTheOrderProductProduced,
  559. getJtIsTheOrderProductProduced,
  560. getCurrentProductionLineSuperior,
  561. updateSpinningInfoPlanOne
  562. } from "@/api/plan/paln.js";
  563. export default {
  564. data() {
  565. return {
  566. options: [],
  567. modifyMachineStatusFrom:{
  568. type: [],
  569. },
  570. modifyMachineStatus:false,
  571. //选中的是那个车间
  572. selectedWorkshop:"南车间",
  573. tableData:[],
  574. isDisabled:true,
  575. form: {
  576. product:"",
  577. },
  578. previousMachineId: undefined,
  579. currentRowspan: 1,
  580. prevRow: {},
  581. tableData2: [],
  582. nanInsertDialogTableVisible:false,
  583. nanUpdateDialogTableVisible:false,
  584. beiInsertDialogTableVisible:false,
  585. beiUpdateDialogTableVisible:false,
  586. editingRowIndex: -1,
  587. lastEditLine:0,
  588. queryParams:{ productionLineDepartment:"加弹部",
  589. productionLineWorkshop:"南车间"},
  590. isEditLine:false,
  591. productsInfo:[],
  592. salesmanInfo:[],
  593. product:{},
  594. materiel:{},
  595. // 机台号
  596. machineId:"",
  597. macId:"",//机台id
  598. // 待机/上机/停产
  599. stateList0:[
  600. {"id":0,"name":"待机"},
  601. {"id":1,"name":"上机"},
  602. ],
  603. stateList1:[
  604. {"id":0,"name":"待机"},
  605. {"id":2,"name":"停机"},
  606. {"id":1,"name":"上机"},
  607. ],
  608. stateList2:[
  609. {"id":0,"name":"待机"},
  610. {"id":2,"name":"停机"},
  611. {"id":1,"name":"上机"},
  612. ],
  613. formData:{
  614. updateSelectedProductCategory:"",
  615. updateSelectedProductState:""
  616. },
  617. // 产品类别
  618. productTypeList:[{value:"A面",lable:"A面"},{value:"B面",lable:"B面"}],
  619. }
  620. },
  621. mounted() {
  622. // 得到排产计划信息
  623. this.getAmmunitionPlanInfo();
  624. },
  625. methods: {
  626. tjqx(){
  627. this.modifyMachineStatus=false;
  628. },
  629. getProductChineseName(productId) {
  630. return this.productsInfo.find(product => product.id == productId).productName;
  631. },
  632. selectedML(row){
  633. console.log(row.currentColorCode)
  634. if(row.currentColorCode){
  635. let tarName=this.options.find(item=>item.value==row.currentColorCode).colourNumber
  636. console.log("aaaaa=============",tarName)
  637. row.colourNumber=tarName;
  638. console.log("aaaaa=============",row)
  639. }
  640. },
  641. //删除计划
  642. deletePlan($index,row){
  643. console.log(row)
  644. //判断当前计划是否已经投产
  645. getJtIsTheOrderProductProduced({"id":row.id}).then(resp=>{
  646. if(resp.data.length>0){
  647. this.$message({message: '当前计划订单产品在生产中已经不能删除', type: 'warning'});
  648. return;//证明有在上级的产品--zhi能有一个上级产品
  649. }
  650. removeBombLoadingPlan(row.id).then(res=>{
  651. if(res.code==200){
  652. this.$message({
  653. message: '删除成功',
  654. type: 'success'
  655. });
  656. }else{
  657. this.$message({message:"删除失败",type: 'error'})
  658. }
  659. this.onSubmit();
  660. this.getAmmunitionPlanInfo();
  661. })
  662. });
  663. },
  664. //打开修改机台信息
  665. handleStopProductionLine(row){
  666. this.modifyMachineStatus=true;
  667. this.machineId=row.machineId;
  668. this.macId=row.macId;//机台id
  669. //查询当前机台A、面B面的状态
  670. whetherTheFeederIsShutDown(this.macId).then(res=>{
  671. this.modifyMachineStatusFrom.type=res.data;
  672. })
  673. },
  674. //确认修改产线信息
  675. confirmStopProductionLine(){
  676. // console.log(this.modifyMachineStatusFrom.type);
  677. if(this.modifyMachineStatusFrom.type.length==0){
  678. this.modifyMachineStatusFrom.type.push("3")
  679. }
  680. //更改状态
  681. updateLineStates(this.macId,this.modifyMachineStatusFrom.type.join(",")).then(res=>{
  682. if(res.code==200){
  683. this.$message({
  684. message: '修改状态成功',
  685. type: 'success'
  686. });
  687. }else{
  688. this.$message({message:"修改状态成功",type: 'error'})
  689. }
  690. this.modifyMachineStatus=false;
  691. this.getAmmunitionPlanInfo();
  692. })
  693. // //如果为空代表都不停机
  694. // if(this.modifyMachineStatusFrom.type.length<=0){
  695. // this.modifyMachineStatus=false;
  696. // //发送请求删除,A面-timestampRandomCode="停机" B-timestampRandomCode="停机"的数据、并把所有上机产品的状态改为上机
  697. // return;
  698. // }
  699. // // 包含1A停机---插入一条 timestampRandomCode=停机,状态为停机的数据
  700. // if (this.modifyMachineStatusFrom.type.includes("1")) {
  701. // //查询当前机台A、面B面的状态
  702. // whetherTheFeederIsShutDown(this.machineId).then(res=>{
  703. // //后台没有虚拟的假数据,就插入
  704. // if(!res.data.includes("1")){
  705. // console.log('数组中不包含数字 1');
  706. // //新增一条数据,
  707. // let aStopInfo= {
  708. // currentColorCode: '1',
  709. // //产品规格
  710. // currentSpecification: '1',
  711. // currentLotNumber: '1',
  712. // currentSpindleCount: '1',
  713. // number: '1',
  714. // productType:'A面',
  715. // startTime: '1',
  716. // plannedEndTime:'1',
  717. // planStatus:2,
  718. // productId:'1',
  719. // machineId:this.machineId,
  720. // salesmanId:'1',
  721. // timestampRandomCode:"停机",
  722. // }
  723. // let aStoptableList=[];
  724. // aStoptableList.push(aStopInfo)
  725. // //时间戳
  726. // let data={
  727. // //机台号
  728. // machineId: this.machineId,
  729. // //计划信息
  730. // detailsOfTheRefuelingPlans: aStoptableList
  731. // }
  732. // //添加计划信息
  733. // addMaterielInfo(data).then(response => {
  734. // if (response.code == 200) {
  735. // this.$message({
  736. // message: '停机成功',
  737. // type: 'success'
  738. // });
  739. // this.getAmmunitionPlanInfo();
  740. // //最后把弹窗关掉
  741. // this.nanInsertDialogTableVisible=false
  742. // //更改订单投产信息的批号,
  743. // } else {
  744. // this.$message({
  745. // message: '停机失败,请联系管理员',
  746. // type: 'error'
  747. // });
  748. // //最后把弹窗关掉
  749. // this.nanInsertDialogTableVisible=false
  750. // }
  751. // });
  752. // }
  753. // })
  754. // }
  755. // if(this.modifyMachineStatusFrom.type.includes("2")) {
  756. // whetherTheFeederIsShutDown(this.machineId).then(res=>{
  757. // if(!res.data.includes("2")) {
  758. // console.log('数组中不包含数字2');
  759. // //新增一条数据,
  760. // let aStopInfo= {
  761. // currentColorCode: '1',
  762. // //产品规格
  763. // currentSpecification: '1',
  764. // currentLotNumber: '1',
  765. // currentSpindleCount: '1',
  766. // number: '1',
  767. // productType:'B面',
  768. // startTime: '1',
  769. // plannedEndTime:'1',
  770. // planStatus:2,
  771. // productId:'1',
  772. // machineId:this.machineId,
  773. // salesmanId:'1',
  774. // timestampRandomCode:"停机",
  775. // }
  776. // let aStoptableList=[];
  777. // aStoptableList.push(aStopInfo)
  778. // //时间戳
  779. // let data={
  780. // //机台号
  781. // machineId: this.machineId,
  782. // //计划信息
  783. // detailsOfTheRefuelingPlans: aStoptableList
  784. // }
  785. // //添加计划信息
  786. // addMaterielInfo(data).then(response => {
  787. // if (response.code == 200) {
  788. // this.$message({
  789. // message: '停机成功',
  790. // type: 'success'
  791. // });
  792. // this.getAmmunitionPlanInfo();
  793. // //最后把弹窗关掉
  794. // this.nanInsertDialogTableVisible=false
  795. // //更改订单投产信息的批号,
  796. // } else {
  797. // this.$message({
  798. // message: '停机失败,请联系管理员',
  799. // type: 'error'
  800. // });
  801. // //最后把弹窗关掉
  802. // this.nanInsertDialogTableVisible=false
  803. // }
  804. // });
  805. // }
  806. // })
  807. // }
  808. },
  809. // 查询排产信息
  810. getAmmunitionPlanInfo() {
  811. ammunitionPlanInfo(this.queryParams).then((response) => {
  812. this.tableData = response.data
  813. });
  814. },
  815. // 合并单元格
  816. spanMethod2({ row, column, rowIndex, columnIndex }) {
  817. //第二列合并
  818. if (columnIndex === 1) {
  819. if(row.productType == null) {
  820. return;
  821. }
  822. const prevRow2 = this.tableData[rowIndex - 1]; // 上一行数据
  823. let nextRow2 = this.tableData[rowIndex + 1]; // 下一行数据
  824. // 当上一行的数据(machineId和productType)等于当前行数据时,当前行单元格隐藏
  825. if (
  826. prevRow2 &&
  827. prevRow2.machineId === row.machineId &&
  828. prevRow2.productType === row.productType
  829. ) {
  830. return { rowspan: 0, colspan: 0 };
  831. } else {
  832. // 反之,则循环判断若下一行数据(machineId和productType)等于当前行数据,则当前行开始进行合并单元格
  833. let countRowspan2 = 1; // 用于合并计数多少单元格
  834. while (
  835. nextRow2 &&
  836. nextRow2.machineId === row.machineId &&
  837. nextRow2.productType === row.productType
  838. ) {
  839. nextRow2 = this.tableData[++countRowspan2 + rowIndex];
  840. }
  841. if (countRowspan2 > 1) {
  842. return { rowspan: countRowspan2, colspan: 1 };
  843. }
  844. }
  845. }
  846. //待生产列表
  847. if (columnIndex === 9) {
  848. const prevRow2 = this.tableData[rowIndex - 1] //上一行数据
  849. let nextRow2 = this.tableData[rowIndex + 1] //下一行数据
  850. // 当上一行的数据等于当前行数据时,当前行单元格隐藏
  851. if(row.listOfPendingProduction==null||row.listOfPendingProduction==undefined|| row.listOfPendingProduction==""){
  852. return;
  853. }
  854. if (prevRow2 &&
  855. prevRow2.machineId === row.machineId &&
  856. prevRow2.productType === row.productType
  857. ) {
  858. return { rowspan: 0, colspan: 0 }
  859. } else {
  860. // 反之,则循环判断若下一行数据等于当前行数据,则当前行开始进行合并单元格
  861. let countRowspan2 = 1 //用于合并计数多少单元格
  862. while (nextRow2 &&
  863. nextRow2.listOfPendingProduction === row.listOfPendingProduction&&
  864. nextRow2.machineId === row.machineId &&
  865. nextRow2.productType === row.productType
  866. ) {
  867. nextRow2 = this.tableData[++countRowspan2 + rowIndex]
  868. }
  869. if (countRowspan2 > 1) {
  870. return { rowspan: countRowspan2, colspan: 1 }
  871. }
  872. }
  873. }
  874. //合并最后一列操作列
  875. const lastColumnIndex = this.$refs.tableRef.store.states.columns.length - 1; // 获取表格最后一列的索引
  876. if (columnIndex === lastColumnIndex && column.label === '操作') { // 判断是否为最后一列且标签为'操作'
  877. const machineIdColumnIndex = 0; // 机台号列的索引假定为0
  878. const currentMachineId = row.machineId;
  879. let countRowspan = 1;
  880. const prevRow = this.tableData[rowIndex - 1];
  881. if (prevRow && prevRow.machineId === currentMachineId) {
  882. return { rowspan: 0, colspan: 0 };
  883. } else {
  884. let nextRow = this.tableData[rowIndex + 1];
  885. while (
  886. nextRow &&
  887. nextRow.machineId === currentMachineId
  888. ) {
  889. nextRow = this.tableData[++countRowspan + rowIndex];
  890. }
  891. if (countRowspan > 1) {
  892. return { rowspan: countRowspan, colspan: 1 };
  893. }
  894. }
  895. }
  896. //第一列机台号合并
  897. if (columnIndex === 0) {
  898. //定义需要合并的列字段,有哪些列需要合并,就自定义添加字段即可
  899. const fields = ['machineId']
  900. // 当前行的数据
  901. const cellValue = row[column.property]
  902. let countRowspan = 1 //用于合并计数多少单元格
  903. // 判断只合并定义字段的列数据
  904. if (cellValue && fields.includes(column.property)) {
  905. const prevRow = this.tableData[rowIndex - 1] //上一行数据
  906. let nextRow = this.tableData[rowIndex + 1] //下一行数据
  907. // 当上一行的数据等于当前行数据时,当前行单元格隐藏
  908. if (prevRow && prevRow[column.property] === cellValue) {
  909. return { rowspan: 0, colspan: 0 }
  910. } else {
  911. // 反之,则循环判断若下一行数据等于当前行数据,则当前行开始进行合并单元格
  912. let countRowspan = 1 //用于合并计数多少单元格
  913. while (nextRow && nextRow[column.property] === cellValue) {
  914. nextRow = this.tableData[++countRowspan + rowIndex]
  915. }
  916. if (countRowspan > 1) {
  917. return { rowspan: countRowspan, colspan: 1 }
  918. }
  919. }
  920. }
  921. }
  922. },
  923. getProductsInfo() {
  924. getProductsInfo("JT-").then((response) => {
  925. this.productsInfo = response.data;
  926. console.log("hmcxzz",this.productsInfo)
  927. this.productsInfo.forEach(item => {
  928. // item.productName = item.productName+"—"+item.materieEncoding+item.materieColorNumber
  929. item.productName = item.productName+"—"+item.colours;
  930. });
  931. })
  932. },
  933. // 下拉框数据改变查询色号批号信息
  934. selectedChangeDate(row,selectedProduct) {
  935. this.options=[];
  936. //选择的那个销售产品
  937. this.product = this.productsInfo.find(product => product.id === selectedProduct);
  938. this.form.product=selectedProduct;
  939. //通过母粒编码查询到对应的母粒信息
  940. let queryParams = {
  941. // "materielCode": this.product.colourNumber,
  942. "materielSpecies":"1"
  943. }
  944. //得到对应的母粒信息
  945. getMaterielInfo(queryParams).then((response) => {
  946. if (response.data!=null) {
  947. let mls = response.data
  948. mls.forEach(dataKey => {
  949. this.options.push({
  950. "label":dataKey.materieEncoding+"("+dataKey.materieColorNumber+")",
  951. "value":dataKey.materieEncoding+"("+dataKey.materieColorNumber+")",
  952. "colourNumber":dataKey.materielCode
  953. })
  954. });
  955. //色号 母粒编码+色号
  956. // row.currentColorCode = this.materiel.materieEncoding+"("+this.materiel.materieColorNumber+")";
  957. }
  958. });
  959. //isDisabled(有批号就用,没批号就自己输入)
  960. if(this.product.lotNumber!=undefined&&this.product.lotNumber!=""){
  961. row.currentLotNumber=this.product.lotNumber;
  962. this.isDisabled=true;
  963. }else {
  964. this.isDisabled=false;
  965. row.currentLotNumber="";
  966. }
  967. //产品规格
  968. row.currentSpecification= this.product.productSpecifications;
  969. //销售单编号(以前打算存的是业务员信息后来存的是销售单编号)
  970. row.salesmanId=this.product.saleOrderNo;
  971. //数量
  972. row.number=this.product.productNumber;
  973. // console.log(this.product,'ddddddddddddddd')
  974. },
  975. // 新增计划产品信息
  976. handleAddPlan(row) {
  977. //查询当前机台A、面B面的状态(这个不用改,因为这个是唯一的)
  978. whetherTheFeederIsShutDown(row.macId).then(res=>{
  979. this.modifyMachineStatusFrom.type=res.data;
  980. if(this.modifyMachineStatusFrom.type.includes("2")&&this.modifyMachineStatusFrom.type.includes("1")){
  981. this.$message({
  982. message: 'AB都已停机请更改机台状态',
  983. type: 'warning'
  984. });
  985. return;
  986. }else {
  987. if(this.modifyMachineStatusFrom.type.includes("1")){
  988. this.productTypeList=[]
  989. this.productTypeList.push({value:"B面",lable:"B面"})
  990. }
  991. if(this.modifyMachineStatusFrom.type.includes("2")){
  992. this.productTypeList=[]
  993. this.productTypeList.push({value:"A面",lable:"A面"})
  994. }
  995. if(this.modifyMachineStatusFrom.type.length<=0){
  996. this.productTypeList=[]
  997. this.productTypeList.push({value:"A面",lable:"A面"})
  998. this.productTypeList.push({value:"B面",lable:"B面"})
  999. }
  1000. //否则就打开弹窗添加计划
  1001. if(this.selectedWorkshop=="南车间"){
  1002. this.nanInsertDialogTableVisible = true
  1003. }else{
  1004. this.beiInsertDialogTableVisible = true
  1005. }
  1006. //查询可以添加的产品信息
  1007. this.getProductsInfo();
  1008. //清空添加的数组对象
  1009. this.tableData2=[]
  1010. //先清空
  1011. this.machineId=""
  1012. //当前操作机台号
  1013. this.machineId=row.machineId;
  1014. this.macId=row.macId;
  1015. }
  1016. })
  1017. },
  1018. // tab栏点击切换
  1019. tabClick(tab, event) {
  1020. // console.log('当前点击的标签名称:', tab.name);
  1021. this.selectedWorkshop = tab.name;
  1022. // productionLineName getProductionLineNo productionLineDepartment productionLineWorkshop
  1023. this.queryParams.productionLineWorkshop = tab.name;
  1024. this.getAmmunitionPlanInfo();
  1025. },
  1026. // 删除行
  1027. handleDelete(index, row) {
  1028. // console.log(index,row)
  1029. // this.tableData2[a];
  1030. this.tableData2.splice(index, 1);
  1031. // 把上一编辑行置回-1
  1032. this.editingRowIndex = -1;
  1033. },
  1034. // 点击编辑行
  1035. handleRowClick(row) {
  1036. // this.isEditLine = true;
  1037. // // alert(this.lastEditLine+"编辑行")
  1038. // //找到当前行的编辑索引
  1039. // var rowIndex = this.tableData2.indexOf(row);
  1040. //
  1041. // if (this.lastEditLine != 0 &&
  1042. // this.editingRowIndex !== rowIndex &&
  1043. // this.editingRowIndex !== -1 &&
  1044. // !this.isRowFilled(this.tableData2[this.lastEditLine])) {
  1045. // this.$message({
  1046. // message: '请先完成上一条数据的填写',
  1047. // type: 'warning'
  1048. // });
  1049. // return;
  1050. // }
  1051. // //编辑索引不等于当前编辑行索引
  1052. // if (this.editingRowIndex !== rowIndex) {
  1053. // // alert(this.editingRowIndex);
  1054. // if (this.editingRowIndex !== -1) {
  1055. // //把当前行变成不可编辑的
  1056. // this.tableData2[this.editingRowIndex].isEditing = false;
  1057. // }
  1058. // //把当前行变成可编辑的
  1059. // row.isEditing = true;
  1060. // this.editingRowIndex = rowIndex;
  1061. // }
  1062. },
  1063. // 光标失去焦点变成不可编辑
  1064. handleInputBlur(row) {
  1065. // let rowIndex = this.tableData2.indexOf(row);
  1066. // //编辑索引不等于当前编辑行索引
  1067. // if (this.editingRowIndex !== rowIndex) {
  1068. // if (this.isRowFilled(row)) {
  1069. // row.isEditing = false;
  1070. // //对于整个表格来说
  1071. // this.isEditLine = false;
  1072. // //当前编辑行置为-1
  1073. // this.editingRowIndex = -1;
  1074. // }
  1075. // }
  1076. },
  1077. // 检查行是否填写完毕的示例方法
  1078. isRowFilled(row) {
  1079. return row.currentSpecification &&
  1080. row.currentSpindleCount &&
  1081. row.currentColorCode &&
  1082. row.productType &&
  1083. row.currentLotNumber &&
  1084. row.number &&
  1085. row.startTime &&
  1086. row.plannedEndTime;
  1087. },
  1088. // 新增一行标记为可编辑
  1089. addEditableRow() {
  1090. // 检查当前编辑行是否已填写完毕
  1091. if(this.tableData2.length!=0){
  1092. if (this.editingRowIndex !== -1 && !this.isRowFilled(this.tableData2[this.editingRowIndex])) {
  1093. this.$message({
  1094. message: '请先完成上一条数据的填写',
  1095. type: 'warning'
  1096. });
  1097. return;
  1098. }
  1099. //新增行之前先让以前的行不能编辑
  1100. this.tableData2.forEach(item => {
  1101. item.isEditing = false;
  1102. })
  1103. }
  1104. this.tableData2.push({
  1105. currentColorCode: '',
  1106. currentSpecification: '',
  1107. currentLotNumber: '',
  1108. currentSpindleCount: '',
  1109. number: '',
  1110. startTime: '',
  1111. plannedEndTime:'',
  1112. planStatus:0,
  1113. productId:'',
  1114. salesmanId:'',
  1115. isEditing: true, // 标记为正在编辑状态
  1116. colourNumber:""
  1117. });
  1118. this.editingRowIndex = this.tableData2.length - 1; // 更新当前编辑的行索引
  1119. this.lastEditLine = this.tableData2.length - 1
  1120. },
  1121. // 添加计划
  1122. addPlanInfo(){
  1123. if(this.tableData2.length>0){
  1124. var flag=true;
  1125. this.tableData2.forEach(item=>{
  1126. if(!this.isRowFilled(item)){
  1127. this.$message({
  1128. message: '请先完善表格数据',
  1129. type: 'warning'
  1130. });
  1131. flag=false
  1132. }
  1133. })
  1134. if(flag){
  1135. const datatime=Date.now()+this.machineId;
  1136. //处理表格数据
  1137. this.tableData2.forEach(item=>{
  1138. item.timestampRandomCode=datatime;
  1139. item.machineId=this.machineId;
  1140. })
  1141. //时间戳
  1142. let data={
  1143. //机台号
  1144. machineId: this.machineId,
  1145. macId:this.macId,
  1146. timestampRandomCode:datatime,
  1147. //计划信息
  1148. detailsOfTheRefuelingPlans: this.tableData2
  1149. }
  1150. //添加计划信息
  1151. addMaterielInfo(data).then(response => {
  1152. if (response.code == 200) {
  1153. this.$message({
  1154. message: '添加成功',
  1155. type: 'success'
  1156. });
  1157. this.getAmmunitionPlanInfo();
  1158. //最后把弹窗关掉
  1159. this.nanInsertDialogTableVisible = false
  1160. this.beiInsertDialogTableVisible = false
  1161. //更改订单投产信息的批号,
  1162. } else {
  1163. this.$message({
  1164. message: '添加失败',
  1165. type: 'error'
  1166. });
  1167. this.nanInsertDialogTableVisible = false
  1168. this.beiInsertDialogTableVisible = false
  1169. //最后把弹窗关掉
  1170. }
  1171. });
  1172. }
  1173. }else {
  1174. this.$message({
  1175. message: '请先添加表格数据',
  1176. type: 'warning'
  1177. });
  1178. return;
  1179. }
  1180. },
  1181. // 修改产品计划
  1182. handleEditPlan(row) {
  1183. //已经在待机列表了,isNull过滤掉了
  1184. getProductsAll(row.macId).then((response) => {
  1185. this.productsInfo = response.data;
  1186. this.productsInfo.forEach(item => {
  1187. item.productName = item.productName+"—"+item.materieEncoding+item.materieColorNumber
  1188. });
  1189. this.tableData2=[];
  1190. //弹窗
  1191. if(this.selectedWorkshop=="南车间"){
  1192. this.nanUpdateDialogTableVisible = true
  1193. }else{
  1194. this.beiUpdateDialogTableVisible = true
  1195. }
  1196. //先清空--当前操作机台号
  1197. this.machineId=""
  1198. this.machineId=row.machineId;
  1199. this.macId=row.macId;
  1200. //查询当前机台下的计划信息
  1201. getAllPlanListByMachineId(this.macId).then((response) => {
  1202. //得到生产中,停产的,待产的
  1203. response.data.forEach(item => {
  1204. item.isEditing=false;
  1205. item.planStatus=parseInt(item.planStatus);
  1206. item.productId=parseInt(item.productId)
  1207. })
  1208. this.tableData2=response.data;
  1209. // console.log( this.tableData2)
  1210. })
  1211. })
  1212. },
  1213. //重置按钮
  1214. reset(){
  1215. this.tableData2=[];
  1216. //弹窗
  1217. if(this.selectedWorkshop=="南车间"){
  1218. this.nanUpdateDialogTableVisible = true
  1219. }else{
  1220. this.beiUpdateDialogTableVisible = true
  1221. }
  1222. console.log(this.machineId,"dddd")
  1223. getAllPlanListByMachineId(this.machineId).then((response) => {
  1224. //得到生产中,停产的,待产的
  1225. response.data.forEach(item => {
  1226. item.isEditing=false;
  1227. item.planStatus=parseInt(item.planStatus);
  1228. item.productId=parseInt(item.productId)
  1229. })
  1230. this.tableData2=response.data;
  1231. // console.log( this.tableData2)
  1232. // 在数据加载完成后,手动触发每个行的第一个下拉框的 change 事件
  1233. this.$nextTick(() => {
  1234. // 获取第一个业务员选择框(假设表格只有一行)
  1235. for (let i = 0; i < this.tableData2.length; i++) {
  1236. const firstSalesmanSelect = this.$refs['salesmanSelect'+i];
  1237. // 触发 change 事件
  1238. if (firstSalesmanSelect) {
  1239. firstSalesmanSelect.$emit('change', {
  1240. target: {value: "ddd"},
  1241. });
  1242. }
  1243. }
  1244. });
  1245. })
  1246. },
  1247. //弹窗里边的点击查询
  1248. onSubmit(){
  1249. this.formData.macId=this.macId;
  1250. getAllPlanListByProductTypeAndStatus(this.formData).then(response => {
  1251. //得到生产中,停产的,待产的
  1252. response.data.forEach(item => {
  1253. item.isEditing=false;
  1254. item.planStatus=parseInt(item.planStatus);
  1255. })
  1256. this.tableData2=response.data;
  1257. });
  1258. },
  1259. //更新状态
  1260. updateStatus(ind, row){
  1261. if(!this.isRowFilled(row)){
  1262. this.$message({message: '请完善当前行数据', type: 'warning'});
  1263. return;
  1264. }
  1265. //判断当前计划是否已经投产
  1266. getJtIsTheOrderProductProduced({"id":row.id}).then(resp=>{
  1267. if(resp.data.length>0) {
  1268. this.$message({message: '当前计划订单产品在生产中已经不能修改', type: 'warning'});
  1269. return;//证明有在上级的产品--zhi能有一个上级产品
  1270. }
  1271. //不是投产中就可以更新了.
  1272. updatePlanOne(row).then(response=>{
  1273. if (response.code == 200) {
  1274. this.$message({
  1275. message: '修改成功',
  1276. type: 'success'
  1277. });
  1278. this.getAmmunitionPlanInfo();
  1279. //最后把弹窗关掉
  1280. this.nanInsertDialogTableVisible=false
  1281. this.beiUpdateDialogTableVisible=false
  1282. } else {
  1283. this.$message({
  1284. message: '修改失败',
  1285. type: 'error'
  1286. });
  1287. //最后把弹窗关掉
  1288. this.nanInsertDialogTableVisible=false
  1289. this.beiUpdateDialogTableVisible=false
  1290. }
  1291. })
  1292. })
  1293. }
  1294. }
  1295. }
  1296. </script>
  1297. <style scoped>
  1298. .el-tabs--border-card >>> .el-tabs__content {
  1299. padding: 0 !important;
  1300. }
  1301. .el-table__body-wrapper {
  1302. cursor: grab;
  1303. }
  1304. .el-table__body-wrapper.grabbing {
  1305. cursor: grabbing;
  1306. }
  1307. .container >>> .el-table .cell {
  1308. white-space: pre-line;
  1309. }
  1310. </style>