index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef1"
  5. v-model:search="data1.search"
  6. :data="data1.data"
  7. :option="data1.option"
  8. v-model:page="data1.page"
  9. @row-save="createRow"
  10. @row-update="updateRow"
  11. @row-del="deleteRow"
  12. @search-change="searchChange"
  13. @search-reset="resetChange"
  14. @size-change="dataList"
  15. @current-change="dataList"
  16. @selection-change="selectionChange"
  17. @cell-click="ckickCell"
  18. >
  19. <template #header="{ size }">
  20. <div id="dailystoragecharts"></div>
  21. </template>
  22. </avue-crud>
  23. <el-dialog
  24. v-model="editDialog.visible"
  25. :title="editDialog.title"
  26. width="1200px"
  27. @close="editDialog.visible = false"
  28. >
  29. <div class="mainContentBox">
  30. <avue-crud
  31. ref="crudRef2"
  32. v-model:search="data2.search"
  33. :data="data2.data"
  34. :option="data2.option"
  35. v-model:page="data2.page"
  36. @row-update="data2.Methords.updateRow"
  37. @row-del="data2.Methords.deleteRow"
  38. @search-change="data2.Methords.dataList"
  39. @search-reset="data2.Methords.resetChange"
  40. @size-change="data2.Methords.dataList"
  41. @current-change="data2.Methords.dataList"
  42. @selection-change="data2.Methords.selectionChange"
  43. />
  44. </div>
  45. </el-dialog>
  46. </div>
  47. </template>
  48. <script setup>
  49. import { ref, getCurrentInstance } from "vue";
  50. import { useCrud } from "@/hooks/userCrud";
  51. import { useCommonStoreHook, useDictionaryStore } from "@/store";
  52. import dictDataUtil from "@/common/configs/dictDataUtil";
  53. import editSkill from "@/views/base/skill/components/edit-skill.vue";
  54. import { getEchartData } from "@/api/report";
  55. import * as echarts from "echarts";
  56. // 数据字典相关
  57. const { dicts } = useDictionaryStore();
  58. const editDialog = ref({ visible: false, title: "订单详情" });
  59. // const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  60. // useCrud({
  61. // src: "/api/v1/process/census/completeOrder",
  62. // });
  63. // ;
  64. const data1 = ref(
  65. useCrud({
  66. src: "/api/v1/process/census/completeOrder",
  67. })
  68. );
  69. const data2 = ref(
  70. useCrud({
  71. src: "/api/v1/process/census/completeSeq",
  72. })
  73. );
  74. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  75. data1.value.Methords;
  76. const { selectionChange, multipleDelete } = data1.value.Methords;
  77. const charts = shallowRef(null);
  78. const chartKey = ref(false);
  79. const chartsData = shallowRef([]);
  80. const cellStyle = ({ row, column, rowIndex, columnIndex }) => {
  81. if (columnIndex == 2) {
  82. // return "color:'#409eff';cursor:'pointer'";
  83. return "cellStyle";
  84. }
  85. };
  86. const ckickCell = (row, column, cell, event) => {
  87. if (column.label === "订单名称") {
  88. data2.value.search.completeTime = row.completeTime;
  89. data2.value.search.orderCode = row.orderCode;
  90. editDialog.value.visible = true;
  91. }
  92. };
  93. // 设置表格列或者其他自定义的option
  94. data1.value.option = Object.assign(data1.value.option, {
  95. selection: false,
  96. menu: false,
  97. menuWidth: 100,
  98. addBtn: false,
  99. filterBtn: false,
  100. searchShowBtn: false,
  101. columnBtn: false,
  102. gridBtn: false,
  103. editBtn: false,
  104. viewBtn: false,
  105. delBtn: false,
  106. column: [
  107. {
  108. label: "日期范围",
  109. prop: "searchTime",
  110. search: true,
  111. hide: true,
  112. type: "date",
  113. format: "YYYY-MM-DD",
  114. valueFormat: "YYYY-MM-DD",
  115. searchRange: true,
  116. startPlaceholder: "开始日期",
  117. endPlaceholder: "结束日期",
  118. },
  119. {
  120. label: "ERP订单号",
  121. prop: "erpCode",
  122. overHidden: true,
  123. search: true,
  124. editDisabled: true,
  125. hide: true,
  126. },
  127. {
  128. label: "产品规格",
  129. prop: "materialModel",
  130. overHidden: true,
  131. search: true,
  132. editDisabled: true,
  133. hide: true,
  134. },
  135. {
  136. label: "订单编码",
  137. prop: "orderCode",
  138. overHidden: true,
  139. search: true,
  140. editDisabled: true,
  141. },
  142. {
  143. label: "订单名称",
  144. prop: "orderName",
  145. width: 140,
  146. overHidden: true,
  147. search: true,
  148. editDisabled: true,
  149. hide: true,
  150. },
  151. {
  152. label: "项目编码",
  153. prop: "projectCode",
  154. width: 140,
  155. overHidden: true,
  156. search: true,
  157. editDisabled: true,
  158. hide: true,
  159. },
  160. {
  161. label: "订单名称",
  162. prop: "orderName",
  163. search: false,
  164. slot: true,
  165. html: true,
  166. formatter: (val) => {
  167. return (
  168. '<span style="color:#409eff;cursor:pointer">' +
  169. val.orderName +
  170. "</span>"
  171. );
  172. },
  173. },
  174. {
  175. label: "ERP订单号",
  176. prop: "erpCode",
  177. search: false,
  178. },
  179. {
  180. label: "交付日期",
  181. prop: "deliverTime",
  182. search: false,
  183. },
  184. {
  185. label: "完工日期",
  186. prop: "completeTime",
  187. search: false,
  188. },
  189. {
  190. label: "项目编码",
  191. prop: "projectCode",
  192. search: false,
  193. },
  194. {
  195. label: "产品编码",
  196. prop: "materialCode",
  197. search: false,
  198. },
  199. {
  200. label: "产品名称",
  201. prop: "materialName",
  202. search: false,
  203. },
  204. {
  205. label: "产品规格",
  206. prop: "materialModel",
  207. search: false,
  208. },
  209. {
  210. label: "计划总共用时(秒)",
  211. prop: "planTotalTime",
  212. search: false,
  213. },
  214. {
  215. label: "实际总共用时(秒)",
  216. prop: "realTotalTime",
  217. search: false,
  218. },
  219. {
  220. label: "总入库数量",
  221. prop: "total",
  222. search: false,
  223. },
  224. ],
  225. });
  226. data2.value.option = Object.assign(data2.value.option, {
  227. selection: false,
  228. addBtn: false,
  229. filterBtn: false,
  230. searchShowBtn: false,
  231. menu: false,
  232. addBtn: false,
  233. filterBtn: false,
  234. searchShowBtn: false,
  235. columnBtn: false,
  236. gridBtn: false,
  237. editBtn: false,
  238. viewBtn: false,
  239. delBtn: false,
  240. column: [
  241. {
  242. label: "流转卡号",
  243. prop: "seqNo",
  244. search: false,
  245. width: 150,
  246. overHidden: true,
  247. },
  248. {
  249. label: "交付日期",
  250. prop: "deliverTime",
  251. search: false,
  252. },
  253. {
  254. label: "完工日期",
  255. prop: "completeTime",
  256. search: false,
  257. },
  258. {
  259. label: "项目编码",
  260. prop: "projectCode",
  261. search: false,
  262. },
  263. {
  264. label: "产品编码",
  265. prop: "materialCode",
  266. search: false,
  267. },
  268. {
  269. label: "产品名称",
  270. prop: "materialName",
  271. search: false,
  272. },
  273. {
  274. label: "产品规格",
  275. prop: "materialModel",
  276. search: false,
  277. },
  278. {
  279. label: "计划总共用时",
  280. prop: "planTotalTime",
  281. search: false,
  282. },
  283. {
  284. label: "实际总共用时",
  285. prop: "realTotalTime",
  286. search: false,
  287. },
  288. {
  289. label: "总入库数量",
  290. prop: "total",
  291. search: false,
  292. },
  293. ],
  294. });
  295. const getCurrentMonthStartAndEndDates = () => {
  296. // 获取当前日期
  297. let now = new Date();
  298. // 获取当前月份的第一天
  299. let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
  300. // 获取当前月份的最后一天
  301. let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
  302. // 格式化日期为'YYYY-MM-DD'格式
  303. function formatDate(date) {
  304. let year = date.getFullYear();
  305. let month = String(date.getMonth() + 1).padStart(2, "0");
  306. let day = String(date.getDate()).padStart(2, "0");
  307. return `${year}-${month}-${day}`;
  308. }
  309. // 返回包含开始和结束日期的数组
  310. return [formatDate(startDate), formatDate(endDate)];
  311. };
  312. const chartSeriesData = shallowRef([]);
  313. const setChartSeries = () => {
  314. let array = [];
  315. for (let j = 0; j < chartsData.value.orderData.length; j++) {
  316. array.push({
  317. name: chartsData.value.orderData[j].orderName,
  318. type: "bar",
  319. barGap: 0,
  320. label: labelOption,
  321. emphasis: {
  322. focus: "series",
  323. },
  324. data: chartsData.value.orderData[j].total,
  325. });
  326. }
  327. chartSeriesData.value = array;
  328. };
  329. const echartOption = ref({
  330. tooltip: {
  331. trigger: "axis",
  332. axisPointer: {
  333. type: "shadow",
  334. },
  335. },
  336. legend: {
  337. // data: chartsData.value.orderCodes,
  338. data: [],
  339. },
  340. xAxis: [
  341. {
  342. type: "category",
  343. axisTick: { show: false },
  344. // data: chartsData.value.dateList,
  345. data: [],
  346. },
  347. ],
  348. yAxis: [
  349. {
  350. type: "value",
  351. },
  352. ],
  353. toolbox: {
  354. feature: {
  355. saveAsImage: {},
  356. },
  357. },
  358. series: [],
  359. // series: chartSeriesData.value,
  360. });
  361. const clickSearch = async () => {
  362. await setChartsData();
  363. await setChartSeries();
  364. echartOption.value.legend.data = chartsData.value.orderCodes;
  365. echartOption.value.xAxis[0].data = chartsData.value.dateList;
  366. echartOption.value.series = chartSeriesData.value;
  367. charts.value.setOption(echartOption.value, true);
  368. };
  369. //设置搜索条件中的时间范围为默认此月
  370. const setTime = () => {
  371. data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
  372. };
  373. const labelOption = {
  374. show: false,
  375. position: "insideBottom",
  376. distance: 15,
  377. align: "left",
  378. verticalAlign: "middle",
  379. rotate: 90,
  380. formatter: "{c} {name|{a}}",
  381. fontSize: 24,
  382. rich: {
  383. name: {},
  384. },
  385. };
  386. const setChartsData = async () => {
  387. const { data } = await getEchartData(data1.value.search);
  388. chartsData.value = data;
  389. };
  390. onMounted(async () => {
  391. setTime();
  392. charts.value = echarts.init(document.getElementById("dailystoragecharts"));
  393. dataList();
  394. });
  395. watch(
  396. () => editDialog.value.visible,
  397. () => {
  398. if (editDialog.value.visible == true) {
  399. data2.value.Methords.dataList();
  400. }
  401. }
  402. );
  403. watch(
  404. () => data1.value.data,
  405. () => {
  406. clickSearch();
  407. }
  408. );
  409. </script>
  410. <style lang="scss" scoped>
  411. :deep(.avue-crud__left) {
  412. width: 100%;
  413. }
  414. .cellStyle {
  415. color: "#409eff" !important;
  416. cursor: "pointer" !important;
  417. }
  418. #dailystoragecharts {
  419. width: 100%;
  420. height: 400px;
  421. border: 1px solid #ccc;
  422. }
  423. </style>