index.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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="createRow"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. @search-change="searchChange"
  14. @search-reset="resetChange"
  15. @size-change="dataList"
  16. @current-change="dataList"
  17. @selection-change="selectionChange"
  18. >
  19. <template #state="scope">
  20. <el-switch
  21. active-value="1"
  22. inactive-value="0"
  23. inline-prompt
  24. active-text="是"
  25. inactive-text="否"
  26. v-model="scope.row.state"
  27. @click="changeItem($event, scope.row)"
  28. class="ml-2"
  29. style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
  30. />
  31. </template>
  32. <template #menu-left="{ size }">
  33. <el-button
  34. type="primary"
  35. icon="el-icon-plus"
  36. :size="size"
  37. @click="openDialog(0, null)"
  38. >新增</el-button
  39. >
  40. </template>
  41. <template #menu="{ size, row, index }">
  42. <el-button type="primary" link size="small" @click="openDialog(1, row)"
  43. ><i-ep-edit />编辑
  44. </el-button>
  45. </template>
  46. <template #menu-right="{}">
  47. <el-dropdown split-button
  48. >准备模板导入
  49. <template #dropdown>
  50. <el-dropdown-menu>
  51. <el-dropdown-item
  52. @click="downloadTemplate('/api/v1/prepareTemplate/template')"
  53. >
  54. <i-ep-download />下载模板
  55. </el-dropdown-item>
  56. <el-dropdown-item @click="importExcelData">
  57. <i-ep-top />导入数据
  58. </el-dropdown-item>
  59. </el-dropdown-menu>
  60. </template>
  61. </el-dropdown>
  62. </template>
  63. </avue-crud>
  64. <el-dialog
  65. v-model="dialog1.visible"
  66. :title="dialog1.title"
  67. width="45%"
  68. @close="dialog1.visible = false"
  69. >
  70. <el-form
  71. ref="dataFormRef"
  72. :model="form"
  73. label-width="90px"
  74. :rules="rules"
  75. >
  76. <el-row :gutter="24">
  77. <el-col :span="8">
  78. <el-form-item label="物料编码" prop="materialCode">
  79. <el-input
  80. v-model="form.materialCode"
  81. @click="openDialog"
  82. readOnly
  83. placeholder="请选择物料"
  84. />
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="8">
  88. <el-form-item label="物料名称" prop="materialName">
  89. <el-input
  90. v-model="form.materialName"
  91. disabled
  92. placeholder="请选择物料"
  93. />
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="8">
  97. <el-form-item label="物料型号" prop="materialModel">
  98. <el-input
  99. v-model="form.materialModel"
  100. disabled
  101. placeholder="请选择物料"
  102. />
  103. </el-form-item>
  104. </el-col>
  105. </el-row>
  106. <el-row :gutter="24">
  107. <el-col :span="24">
  108. <el-form-item label="物料模板" prop="template">
  109. <el-select
  110. v-model="form.template"
  111. multiple
  112. placeholder="请选择模板"
  113. @change="changeTemplate"
  114. >
  115. <el-option
  116. v-for="item in templates"
  117. :label="item.dictLabel"
  118. :value="item.dictValue"
  119. :key="item.dictLabel"
  120. />
  121. </el-select>
  122. </el-form-item>
  123. </el-col>
  124. </el-row>
  125. <el-row :gutter="24" v-for="item in clickTemplates">
  126. <el-col :span="24">
  127. <el-form-item :label="item.name">
  128. <el-switch
  129. class="mb-2"
  130. style="
  131. --el-switch-on-color: #13ce66;
  132. --el-switch-off-color: #ff4949;
  133. "
  134. active-text="完成"
  135. inactive-text="未完成"
  136. active-value="1"
  137. inactive-value="0"
  138. />
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. </el-form>
  143. <template #footer>
  144. <div class="dialog-footer">
  145. <el-button type="primary" @click="onSubmit">确 定</el-button>
  146. <el-button @click="dialog1.visible = false">取 消</el-button>
  147. </div>
  148. </template>
  149. </el-dialog>
  150. <el-dialog
  151. v-model="dialog.visible"
  152. :title="dialog.title"
  153. width="80%"
  154. @close="dialog.visible = false"
  155. >
  156. <choice-item-page @material-info="materialInfo" />
  157. </el-dialog>
  158. <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
  159. </div>
  160. </template>
  161. <script setup>
  162. import { ref, getCurrentInstance } from "vue";
  163. import { useCrud } from "@/hooks/userCrud";
  164. import { useCommonStoreHook } from "@/store";
  165. import { queryDictDataByType } from "@/api/system/dict";
  166. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  167. const router = useRouter();
  168. // 传入一个url,后面不带/
  169. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  170. useCrud({
  171. src: "/api/v1/prepareTemplate",
  172. });
  173. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  174. Methords; //增删改查
  175. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  176. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  177. const dataFormRef = ref(ElForm);
  178. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  179. const dialog = reactive({
  180. title: "物料选择",
  181. visible: false,
  182. });
  183. const dialog1 = reactive({
  184. title: "模板保存",
  185. visible: false,
  186. });
  187. const uploadRef = ref(null);
  188. const importExcelData = () => {
  189. if (uploadRef.value) {
  190. uploadRef.value.show("/api/v1/prepareTemplate/importExcel");
  191. }
  192. };
  193. const uploadFinished = () => {
  194. // 上传完成后的刷新操作
  195. page.currentPage = 1;
  196. dataList();
  197. };
  198. const openDialog = (type, row) => {
  199. if (type === 0) {
  200. form.value.materialCode = "";
  201. form.value.materialName = "";
  202. form.value.materialModel = "";
  203. form.value.template = [];
  204. templates.value.forEach((item)=>{
  205. form.value.template.push(item.dictValue)
  206. })
  207. clickTemplates.value = [];
  208. dialog1.visible = true;
  209. } else if (type === 1) {
  210. form.value = row;
  211. if (!Array.isArray(row.template)) {
  212. form.value.template = eval("(" + row.template + ")");
  213. }
  214. //form.value.templateList = row.template.split(",")
  215. changeTemplate();
  216. dialog1.visible = true;
  217. } else {
  218. dialog.visible = true;
  219. }
  220. };
  221. const changeItem = (obj, row) => {
  222. form.value = { id: row.id, state: row.state };
  223. updateRow();
  224. form.value = null;
  225. dataList();
  226. };
  227. const templates = ref([]);
  228. const clickTemplates = ref([]);
  229. const changeTemplate = () => {
  230. clickTemplates.value = [];
  231. if (form.value.template) {
  232. for (let i = 0; i < form.value.template.length; i++) {
  233. clickTemplates.value.push({
  234. value: form.value.template[i],
  235. name: templates.value.find(
  236. (option) => option.dictValue === form.value.template[i]
  237. ).dictLabel,
  238. });
  239. }
  240. }
  241. };
  242. const onSubmit = (done, loading) => {
  243. dataFormRef.value.validate((isValid) => {
  244. if (isValid) {
  245. if (!form.value.id) {
  246. createRow(done, loading);
  247. } else {
  248. updateRow(done, loading);
  249. }
  250. dialog1.visible = false;
  251. }
  252. });
  253. console.log("submit!");
  254. };
  255. const materialInfo = (value) => {
  256. form.value.materialCode = value.materialCode;
  257. form.value.materialName = value.materialName;
  258. form.value.materialModel = value.spec;
  259. dialog.visible = false;
  260. };
  261. // 设置表格列或者其他自定义的option
  262. option.value = Object.assign(option.value, {
  263. delBtn: true,
  264. selection: false,
  265. editBtn: false,
  266. viewBtn: false,
  267. menuBtn: true,
  268. menuWidth: 150,
  269. addBtn: false,
  270. dialogWidth: "45%", // 设置编辑弹窗的宽度为50%
  271. column: [
  272. {
  273. label: "物料编码",
  274. prop: "materialCode",
  275. search: true,
  276. overHidden: true,
  277. disabled: true,
  278. rules: [
  279. {
  280. required: true,
  281. message: "产品编码不能为空",
  282. trigger: "trigger",
  283. },
  284. ],
  285. },
  286. {
  287. label: "产品名称",
  288. prop: "materialName",
  289. disabled: true,
  290. overHidden: true,
  291. search: true,
  292. rules: [
  293. {
  294. required: true,
  295. message: "产品名称不能为空",
  296. trigger: "trigger",
  297. },
  298. ],
  299. },
  300. {
  301. label: "产品规格",
  302. prop: "materialModel",
  303. disabled: true,
  304. search: true,
  305. overHidden: true,
  306. rules: [
  307. {
  308. required: true,
  309. message: "产品规格不能为空",
  310. trigger: "trigger",
  311. },
  312. ],
  313. },
  314. {
  315. label: "是否启用",
  316. prop: "state",
  317. editDisplay: false,
  318. addDisplay: false,
  319. slot: true,
  320. width: 100,
  321. },
  322. {
  323. label: "创建时间",
  324. prop: "created",
  325. width: 200,
  326. display: false,
  327. },
  328. {
  329. label: "创建人",
  330. width: 200,
  331. prop: "creator",
  332. display: false,
  333. },
  334. ],
  335. });
  336. const rules = reactive({
  337. materialCode: [{ required: true, message: "请选择物料", trigger: "blur" }],
  338. template: [{ required: true, message: "请选择模板值", trigger: "blur" }],
  339. });
  340. onMounted(() => {
  341. dataList();
  342. queryDictDataByType("prepare_template").then((res) => {
  343. templates.value = res.data;
  344. });
  345. });
  346. </script>
  347. <style scoped>
  348. :deep(.el-progress-bar__innerText) {
  349. color: #737674;
  350. display: inline-block;
  351. font-size: 12px;
  352. margin: 0 5px;
  353. vertical-align: middle;
  354. }
  355. </style>