index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. v-model:search="search"
  6. v-model="form"
  7. :data="data"
  8. :option="option"
  9. v-model:page="page"
  10. @row-save="createRowSave"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. :table-loading="loading"
  14. @search-change="searchChange"
  15. @search-reset="resetChange"
  16. @size-change="dataList"
  17. @current-change="dataList"
  18. @selection-change="selectionChange"
  19. >
  20. <template #menu="{ size, row, index }">
  21. <!-- <el-button
  22. icon="el-icon-edit"
  23. text
  24. @click="openDialog(1, row.id)"
  25. type="primary"
  26. :size="size"
  27. >编辑</el-button
  28. >-->
  29. <el-button
  30. icon="el-icon-view"
  31. text
  32. @click="openDialog(0, row)"
  33. type="primary"
  34. :size="size"
  35. >详情</el-button
  36. >
  37. </template>
  38. </avue-crud>
  39. <el-dialog
  40. v-model="dialog.visible"
  41. :title="dialog.title"
  42. width="1650px"
  43. @close="dialog.visible = false"
  44. >
  45. <!-- <el-button
  46. class="ml-3"
  47. style="margin-bottom: 5px;"
  48. @click="handleExport"
  49. >
  50. <template #icon> <i-ep-download /> </template>导出
  51. </el-button>-->
  52. <el-table :data="itemList" border style="width: 100%" span-method="objectSpanMethod">
  53. <el-table-column show-overflow-tooltip prop="operationName" label="工序" width="100"/>
  54. <el-table-column show-overflow-tooltip prop="materialModel" label="物料型号" width="100"/>
  55. <el-table-column show-overflow-tooltip prop="workOrderCode" label="产品批号" width="120"/>
  56. <el-table-column prop="reNum" label="数量(接收)" width="70">
  57. <template v-if="dialog.type === 1" #default="scope">
  58. <el-input v-model="scope.row.reNum"></el-input>
  59. </template>
  60. </el-table-column>
  61. <el-table-column prop="reFrontUser" label="下传人(接收)" width="140">
  62. <template v-if="dialog.type === 1" #default="scope">
  63. <el-input v-model="scope.row.reFrontUser"></el-input>
  64. </template>
  65. </el-table-column>
  66. <el-table-column prop="reReceiveUser" label="接收人(接收)" width="140">
  67. <template v-if="dialog.type === 1" #default="scope">
  68. <el-input v-model="scope.row.reReceiveUser"></el-input>
  69. </template>
  70. </el-table-column>
  71. <el-table-column prop="reDate" label="时间(接收)" width="120">
  72. <template v-if="dialog.type === 1" #default="scope">
  73. <el-date-picker value-format="YYYY-MM-DD" type="date" v-model="scope.row.reDate"></el-date-picker>
  74. </template>
  75. </el-table-column>
  76. <el-table-column prop="next0Num" label="数量(下传合格)" width="80">
  77. <template v-if="dialog.type === 1" #default="scope">
  78. <el-input v-model="scope.row.next0Num"></el-input>
  79. </template>
  80. </el-table-column>
  81. <el-table-column prop="next0FrontUser" label="下传人(下传合格)" width="140">
  82. <template v-if="dialog.type === 1" #default="scope">
  83. <el-input v-model="scope.row.next0FrontUser"></el-input>
  84. </template>
  85. </el-table-column>
  86. <el-table-column prop="next0ReceiveUser" label="接收人(下传合格)" width="140">
  87. <template v-if="dialog.type === 1" #default="scope">
  88. <el-input v-model="scope.row.next0ReceiveUser"></el-input>
  89. </template>
  90. </el-table-column>
  91. <el-table-column prop="next0Date" label="时间(下传合格)" width="120">
  92. <template v-if="dialog.type === 1" #default="scope">
  93. <el-date-picker value-format="YYYY-MM-DD" type="date" v-model="scope.row.next0Date"/>
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="next1Num" label="数量(下传不合格)" width="80">
  97. <template v-if="dialog.type === 1" #default="scope">
  98. <el-input v-model="scope.row.next1Num"></el-input>
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="next1FrontUser" label="下传人(下传不合格)" width="140">
  102. <template v-if="dialog.type === 1" #default="scope">
  103. <el-date-picker value-format="YYYY-MM-DD" type="date" v-model="scope.row.next1FrontUser"/>
  104. </template>
  105. </el-table-column>
  106. <el-table-column prop="next1ReceiveUser" label="接收人(下传不合格)" width="140">
  107. <template v-if="dialog.type === 1" #default="scope">
  108. <el-input v-model="scope.row.next1ReceiveUser"></el-input>
  109. </template>
  110. </el-table-column>
  111. <el-table-column prop="next1Date" label="时间(下传不合格)" width="100">
  112. <template v-if="dialog.type === 1" #default="scope">
  113. <el-input v-model="scope.row.next1Date"></el-input>
  114. </template>
  115. </el-table-column>
  116. <el-table-column prop="remark" label="备注" width="100">
  117. <template v-if="dialog.type === 1" #default="scope">
  118. <el-input v-model="scope.row.remark"></el-input>
  119. </template>
  120. </el-table-column>
  121. </el-table>
  122. <div
  123. class="dialog-footer"
  124. style="margin-top: 10px;"
  125. align="center"
  126. >
  127. <el-button @click="dialog.visible = false">取 消</el-button>
  128. <el-button type="primary" @click="handleExport" v-if="itemList.value !== 0">导 出</el-button>
  129. </div>
  130. </el-dialog>
  131. </div>
  132. </template>
  133. <script setup>
  134. import { ref, getCurrentInstance } from "vue";
  135. import { useCrud } from "@/hooks/userCrud";
  136. import { exportOperationRecord ,addProRecord,queryProductHandover,updateHandoverList} from "@/api/process";
  137. import { useCommonStoreHook } from "@/store";
  138. import dictDataUtil from "@/common/configs/dictDataUtil";
  139. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  140. const test = () => {
  141. isShowTable.value = true;
  142. tableType.value = tableType.value == 1 ? 2 : 1;
  143. };
  144. const radio = ref(0);
  145. // 传入一个url,后面不带/
  146. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  147. useCrud({
  148. dataListUrl: "/api/v1/proRecord/queryCompleteOpList",
  149. });
  150. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  151. Methords; //增删改查
  152. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  153. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  154. const loading = ref(false);
  155. const times = ref(null)
  156. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  157. const dialog = reactive({
  158. title: "产品交接",
  159. visible: false,
  160. type: 0,
  161. });
  162. const dialog0 = reactive({
  163. title: "完工工序",
  164. visible: false,
  165. });
  166. const createRowSave = (row,done,loading) =>{
  167. if(!row.startDate || !row.endDate){
  168. ElMessage.error("请选择日期");
  169. loading()
  170. }else{
  171. done();
  172. times.value = row;
  173. dialog0.visible = true
  174. }
  175. /*form.value.type = "0"
  176. addProRecord(form.value).then((data) =>{
  177. ElMessage.success(data.msg);
  178. form.value.startDate = "";
  179. form.value.endDate = "";
  180. done();
  181. dialog.visible = true;
  182. dialog.type = 1
  183. itemList.value = data.data
  184. dataList()
  185. }).catch(() => {
  186. loading()
  187. });*/
  188. }
  189. const clickOperationType = ref(null)
  190. const itemList = ref([])
  191. const openDialog = (type, row) => {
  192. clickOperationType.value = row.operationType
  193. queryProductHandover(row).then((data) => {
  194. itemList.value = data.data;
  195. dialog.visible = true;
  196. dialog.type = type;
  197. });
  198. };
  199. const saveItemList = () => {
  200. updateHandoverList(itemList.value).then((data) => {
  201. if (data.code === "200") {
  202. ElMessage.success("操作成功");
  203. dialog.visible = false;
  204. dataList();
  205. } else {
  206. ElMessage.error(data.msg);
  207. }
  208. });
  209. };
  210. // 设置表格列或者其他自定义的option
  211. option.value = Object.assign(option.value, {
  212. searchEnter: true,
  213. editBtn: false,
  214. delBtn: false,
  215. viewBtn: false,
  216. addBtn: false,
  217. selection: false,
  218. column: [
  219. {
  220. label: "开始日期",
  221. prop: "startDate",
  222. type: "date",
  223. format: "YYYY-MM-DD", //前端展示格式
  224. valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
  225. overHidden: true,
  226. search: true,
  227. },
  228. {
  229. label: "结束日期",
  230. prop: "endDate",
  231. type: "date",
  232. format: "YYYY-MM-DD", //前端展示格式
  233. valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
  234. search: true,
  235. overHidden: true,
  236. },
  237. {
  238. label: "工序类型",
  239. overHidden: true,
  240. prop: "operationType",
  241. search: true,
  242. type: 'select',
  243. dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.process_type,
  244. props: {
  245. label: "dictLabel",
  246. value: "dictValue",
  247. },
  248. addDisplay: false,
  249. editDisplay: false,
  250. },
  251. {
  252. label: "完工数量",
  253. overHidden: true,
  254. prop: "completeNum",
  255. addDisplay: false,
  256. editDisplay: false,
  257. },
  258. ],
  259. });
  260. const handleExport = () => {
  261. if(data.value.length !== 0){
  262. exportOperationRecord({...search.value,operationType: clickOperationType.value,type: 0}).then((response) => {
  263. try {
  264. const decoder = new TextDecoder("utf-8");
  265. const jsonString = decoder.decode(response.data);
  266. const jsonObject = JSON.parse(jsonString);
  267. const { code, msg } = jsonObject;
  268. if (code != "200") {
  269. ElMessage.error(msg);
  270. }
  271. } catch (e) {
  272. downFile(response);
  273. }
  274. })
  275. }else{
  276. ElMessage.error("请先搜索数据");
  277. }
  278. };
  279. const downFile = (response) => {
  280. const fileData = response.data;
  281. const fileName = decodeURI(
  282. response.headers["content-disposition"].split(";")[1].split("=")[1]
  283. );
  284. const fileType =
  285. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
  286. const blob = new Blob([fileData], { type: fileType });
  287. const downloadUrl = window.URL.createObjectURL(blob);
  288. const downloadLink = document.createElement("a");
  289. downloadLink.href = downloadUrl;
  290. downloadLink.download = fileName;
  291. document.body.appendChild(downloadLink);
  292. downloadLink.click();
  293. document.body.removeChild(downloadLink);
  294. window.URL.revokeObjectURL(downloadUrl);
  295. };
  296. onMounted(() => {
  297. form.value.type = "0"
  298. search.value.type = "0"
  299. const now = new Date();
  300. const year = now.getFullYear();
  301. let month = now.getMonth() + 1; // 从0开始的月份
  302. // 当月结束日期
  303. const daysInMonth = new Date(year, now.getMonth() + 1, 0).getDate();
  304. month = month.toLocaleString().length === 1 ? "0" + month : month;
  305. search.value.startDate = year + "-" + month + "-" + "01"
  306. search.value.endDate = year + "-" + month + "-" + daysInMonth
  307. dataList();
  308. });
  309. </script>
  310. <style>
  311. /* 添加自定义类名以区分不同表格的样式 */
  312. .gray-header-table .el-table__header-wrapper {
  313. background-color: #f2f2f2; /* 灰色背景 */
  314. }
  315. </style>