index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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="clickSearch"
  15. @current-change="clickSearch"
  16. @selection-change="selectionChange"
  17. >
  18. <template #header="{ size }">
  19. <div id="dailystoragecharts"></div>
  20. </template>
  21. <template #menu-right="{}">
  22. <el-button
  23. class="ml-3"
  24. @click="exportData('/api/v1/process/census/beatInfo/export')"
  25. >
  26. <template #icon> <i-ep-download /> </template>导出
  27. </el-button>
  28. </template>
  29. </avue-crud>
  30. </div>
  31. </template>
  32. <script setup>
  33. import { ref, getCurrentInstance } from "vue";
  34. import { useCrud } from "@/hooks/userCrud";
  35. import { useCommonStoreHook, useDictionaryStore } from "@/store";
  36. import dictDataUtil from "@/common/configs/dictDataUtil";
  37. import editSkill from "@/views/base/skill/components/edit-skill.vue";
  38. import { getBeatInfo } from "@/api/report";
  39. import * as echarts from "echarts";
  40. // 数据字典相关
  41. const { dicts } = useDictionaryStore();
  42. // const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  43. // useCrud({
  44. // src: "/api/v1/process/census/completeOrder",
  45. // });
  46. // ;
  47. const data1 = ref(
  48. useCrud({
  49. src: "/api/v1/process/census/beatInfo",
  50. })
  51. );
  52. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  53. data1.value.Methords;
  54. const { selectionChange, multipleDelete } = data1.value.Methords;
  55. const { checkBtnPerm, downloadTemplate, exportData } = data1.value.Utils;
  56. const charts = shallowRef(null);
  57. const chartsData = ref([]);
  58. // 设置表格列或者其他自定义的option
  59. data1.value.option = Object.assign(data1.value.option, {
  60. selection: true,
  61. menu: false,
  62. menuWidth: 100,
  63. addBtn: false,
  64. filterBtn: false,
  65. searchShowBtn: false,
  66. columnBtn: false,
  67. gridBtn: false,
  68. editBtn: false,
  69. viewBtn: false,
  70. delBtn: false,
  71. column: [
  72. {
  73. label: "日期范围",
  74. prop: "searchTime",
  75. search: true,
  76. hide: true,
  77. type: "date",
  78. format: "YYYY-MM-DD",
  79. valueFormat: "YYYY-MM-DD",
  80. searchRange: true,
  81. startPlaceholder: "开始日期",
  82. endPlaceholder: "结束日期",
  83. },
  84. {
  85. label: "订单编码",
  86. prop: "orderCode",
  87. overHidden: true,
  88. search: true,
  89. editDisabled: true,
  90. hide: true,
  91. },
  92. {
  93. label: "物料编码",
  94. prop: "materialCode",
  95. overHidden: true,
  96. search: true,
  97. editDisabled: true,
  98. hide: true,
  99. },
  100. {
  101. label: "工单编码",
  102. prop: "workOrderCode",
  103. width: 140,
  104. overHidden: true,
  105. search: true,
  106. editDisabled: true,
  107. hide: true,
  108. },
  109. //展示
  110. {
  111. label: "订单编码",
  112. prop: "orderCode",
  113. search: false,
  114. },
  115. {
  116. label: "订单名称",
  117. prop: "orderName",
  118. search: false,
  119. },
  120. {
  121. label: "工单编码",
  122. prop: "workOrderCode",
  123. search: false,
  124. },
  125. {
  126. label: "工单数量",
  127. prop: "planNum",
  128. search: false,
  129. },
  130. {
  131. label: "物料编码",
  132. prop: "materialCode",
  133. search: false,
  134. },
  135. {
  136. label: "物料名称",
  137. prop: "materialName",
  138. search: false,
  139. },
  140. {
  141. label: "物料规格",
  142. prop: "materialModel",
  143. search: false,
  144. },
  145. {
  146. label: "标准用时(秒)",
  147. prop: "standardWorktime",
  148. search: false,
  149. },
  150. {
  151. label: "总共用时(秒)",
  152. prop: "totalTime",
  153. search: false,
  154. },
  155. {
  156. label: "时差比",
  157. prop: "totalTime",
  158. search: false,
  159. html: true,
  160. formatter: (val) => {
  161. return (
  162. "<span>" +
  163. (Number(val.totalTime) - Number(val.standardWorktime)) +
  164. "</span>"
  165. );
  166. },
  167. },
  168. ],
  169. });
  170. const getCurrentMonthStartAndEndDates = () => {
  171. // 获取当前日期
  172. let now = new Date();
  173. // 获取当前月份的第一天
  174. let startDate = new Date(now.getFullYear(), now.getMonth(), 1);
  175. // 获取当前月份的最后一天
  176. let endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0);
  177. // 格式化日期为'YYYY-MM-DD'格式
  178. function formatDate(date) {
  179. let year = date.getFullYear();
  180. let month = String(date.getMonth() + 1).padStart(2, "0");
  181. let day = String(date.getDate()).padStart(2, "0");
  182. return `${year}-${month}-${day}`;
  183. }
  184. // 返回包含开始和结束日期的数组
  185. return [formatDate(startDate), formatDate(endDate)];
  186. };
  187. const clickSearch = async () => {
  188. await setChartsData();
  189. setOption();
  190. charts.value.setOption(
  191. {
  192. darkMode: true,
  193. textStyle: {
  194. color: "#fff",
  195. },
  196. tooltip: {
  197. trigger: "axis",
  198. axisPointer: {
  199. type: "shadow",
  200. },
  201. },
  202. legend: {
  203. data: ["标准用时", "总共用时", "时差比"],
  204. },
  205. xAxis: [
  206. {
  207. type: "category",
  208. axisTick: { show: false },
  209. data: chartOption.value.xData,
  210. },
  211. ],
  212. toolbox: {
  213. feature: {
  214. saveAsImage: {},
  215. },
  216. },
  217. yAxis: [
  218. {
  219. type: "value",
  220. },
  221. ],
  222. series: chartOption.value.series,
  223. },
  224. true
  225. );
  226. };
  227. //设置搜索条件中的时间范围为默认此月
  228. const setTime = () => {
  229. data1.value.search.searchTime = getCurrentMonthStartAndEndDates();
  230. };
  231. const labelOption = {
  232. show: false,
  233. position: "insideBottom",
  234. distance: 15,
  235. align: "left",
  236. verticalAlign: "middle",
  237. rotate: 90,
  238. formatter: "{c} {name|{a}}",
  239. fontSize: 24,
  240. rich: {
  241. name: {},
  242. },
  243. };
  244. const chartOption = ref({
  245. xData: [],
  246. series: [],
  247. });
  248. const setChartsData = async () => {
  249. const { data } = await getBeatInfo({
  250. ...data1.value.search,
  251. pageSize: 99999,
  252. });
  253. chartsData.value = data.records;
  254. };
  255. const setOption = () => {
  256. let array1 = [];
  257. let array2 = [];
  258. let obj1 = {
  259. name: "标准用时",
  260. type: "bar",
  261. barGap: 0,
  262. label: labelOption,
  263. emphasis: {
  264. focus: "series",
  265. },
  266. data: [],
  267. };
  268. let obj2 = {
  269. name: "总共用时",
  270. type: "bar",
  271. barGap: 0,
  272. label: labelOption,
  273. emphasis: {
  274. focus: "series",
  275. },
  276. data: [],
  277. };
  278. let obj3 = {
  279. name: "时差比",
  280. type: "bar",
  281. barGap: 0,
  282. label: labelOption,
  283. emphasis: {
  284. focus: "series",
  285. },
  286. data: [],
  287. };
  288. chartsData.value.forEach((item) => {
  289. array1.push(`${item.orderName}:${item.workOrderCode}`);
  290. obj1.data.push(item.standardWorktime);
  291. obj2.data.push(item.totalTime);
  292. obj3.data.push(Number(item.totalTime) - Number(item.standardWorktime));
  293. });
  294. array2 = [obj1, obj2, obj3];
  295. chartOption.value.xData = array1;
  296. chartOption.value.series = array2;
  297. };
  298. onMounted(async () => {
  299. setTime();
  300. charts.value = echarts.init(document.getElementById("dailystoragecharts"));
  301. dataList();
  302. clickSearch();
  303. });
  304. watch(
  305. () => data1.value.data,
  306. () => {
  307. clickSearch();
  308. }
  309. );
  310. </script>
  311. <style lang="scss" scoped>
  312. :deep(.avue-crud__left) {
  313. width: 100%;
  314. }
  315. .cellStyle {
  316. color: "#409eff" !important;
  317. cursor: "pointer" !important;
  318. }
  319. #dailystoragecharts {
  320. width: 100%;
  321. height: 400px;
  322. border: 1px solid #ccc;
  323. }
  324. </style>