Prechádzať zdrojové kódy

产品 物料库重构

asd26269546 2 rokov pred
rodič
commit
b0d152c6a9

+ 103 - 61
src/views/login.vue

@@ -3,8 +3,9 @@
 		<div class="login-header">
 			<img class="logo" src="../assets/logo.png" />
 
-			<h2>{{ $t('login.title') }}</h2>{{code}}123
-		</div>
+			<h2>{{ $t('login.title') }}</h2>
+			
+		</div> 
 		<div class="login-form">
 			<van-field
 				v-model="loginForm.tenantId"
@@ -28,28 +29,36 @@
 				placeholder="请输入密码"
 				:rules="[{ required: true, message: '请填写密码' }]"
 			/>
-			
+
 			<van-form @submit="onSubmit">
-				<van-cell-group inset>
-					
-				</van-cell-group>
+				<van-cell-group inset> </van-cell-group>
 				<div style="margin: 16px">
 					<van-button round block type="primary" native-type="submit">
 						提交
 					</van-button>
 				</div>
-				<div class="check-warp" style="text-align:left;justify-content:left;">
+				<div
+					class="check-warp"
+					style="text-align: left; justify-content: left"
+				>
 					<div class="check-icon-warp">
-						<van-checkbox icon-size="16px" v-model="rememberMe"></van-checkbox>
+						<van-checkbox
+							icon-size="16px"
+							v-model="rememberMe"
+						></van-checkbox>
 					</div>
 					记住密码
 				</div>
 			</van-form>
 		</div>
+		{{ loginData }}+++{{code}}
 		<div class="login-btn">
 			<div class="check-warp">
 				<div class="check-icon-warp">
-					<van-checkbox icon-size="16px" v-model="clause"></van-checkbox>
+					<van-checkbox
+						icon-size="16px"
+						v-model="clause"
+					></van-checkbox>
 				</div>
 				{{ $t('login.agreement.text') }}
 				<span>{{ $t('login.agreement.clause') }}</span>
@@ -67,71 +76,71 @@
 <style lang="scss" scoped>
 .login {
 	height: 100vh;
-	width: 100vw;
+	width: 100%;
 	background-size: 100% 100%;
 	background: #fff;
-	.check-warp{
+	.check-warp {
 		display: flex;
 		align-items: center;
 		justify-content: center;
-		.check-icon-warp{
+		.check-icon-warp {
 			margin-right: 5px;
 		}
-		span{
-			color: #3370FF;
+		span {
+			color: #3370ff;
 			margin: 0 4px;
 		}
 	}
-	.login-form{
-		padding:5px 20px;
+	.login-form {
+		padding: 5px 20px;
 	}
-	.login-btn{
+	.login-btn {
 		font-size: 12px;
 		position: fixed;
 		bottom: 50px;
 		left: 0;
 		right: 0;
 	}
-	.van-cell{
+	.van-cell {
 		border: 5px;
 		background: #f1f1f1;
-		margin-bottom:12px;
+		margin-bottom: 12px;
 		height: 50px;
 		box-sizing: border-box;
 		line-height: 44px;
 		padding: 3px 12px;
 		font-size: 16px;
 	}
-	.login-header{
+	.login-header {
 		background: url(../assets/images/login-header.png) no-repeat;
-		height:200px;
+		height: 200px;
 		background-size: cover;
 		padding: 44px 20px 17px;
 		box-sizing: border-box;
-		.logo{
+		.logo {
 			height: 45px;
 		}
-		h2{
+		h2 {
 			margin-top: 40px;
 		}
 	}
 }
 </style>
 <script setup>
-import 'vant/lib/index.css';
-import { ref,getCurrentInstance, onMounted } from 'vue';
-import { setUserInfo,setToken, getUserInfo } from '@/utils/auth';
-import * as dd from "dingtalk-jsapi";
+import 'vant/lib/index.css'
+import { ref, getCurrentInstance, onMounted } from 'vue'
+import { setUserInfo, setToken, getUserInfo } from '@/utils/auth'
+import * as dd from 'dingtalk-jsapi'
 import axios from 'axios'
 import { useRoute } from 'vue-router'
 const route = useRoute()
-const proxy = getCurrentInstance().proxy;
+const proxy = getCurrentInstance().proxy
 
 const loginForm = ref({
 	username: '',
 	password: '',
 	rememberMe: false,
-	tenantId:'',
+	tenantId: '',
 	code: '',
 	uuid: '',
 })
@@ -141,67 +150,100 @@ const clause = ref(false)
 const radioChange = () => {
 	console.log(loginForm.rememberMe)
 	// loginForm.value.rememberMe = loginForm.value.rememberMe ? false : false;
-};
+}
 
 const onSubmit = () => {
-	proxy.post('login', loginForm.value,'post',{tenantId:loginForm.value.tenantId}).then((res) => {
-		console.log(res)
-		if(res.code == 200) {
-			setToken(res.token)
-			getInfo()
-		}
-	})
-};
+	proxy
+		.post('login', loginForm.value, 'post', {
+			tenantId: loginForm.value.tenantId,
+		})
+		.then((res) => {
+			console.log(res)
+			if (res.code == 200) {
+				setToken(res.token)
+				getInfo()
+			}
+		})
+}
 
 const getInfo = () => {
-	proxy.post('getInfo', {},'get').then((res) => {
+	proxy.post('getInfo', {}, 'get').then((res) => {
 		console.log(res)
-		if(res.code == 200) {
+		if (res.code == 200) {
 			setUserInfo(res.user)
-			window.localStorage.setItem('tenantId',loginForm.value.tenantId)
-			if(rememberMe.value){
-				window.localStorage.setItem('username',loginForm.value.username)
-				window.localStorage.setItem('password',loginForm.value.password)
-				window.localStorage.setItem('rememberMe',rememberMe.value)
-			}else{
-				window.localStorage.setItem('username','')
-				window.localStorage.setItem('password','')
-				window.localStorage.setItem('tenantId','')
-				window.localStorage.setItem('rememberMe',false)
+			window.localStorage.setItem('tenantId', loginForm.value.tenantId)
+			if (rememberMe.value) {
+				window.localStorage.setItem(
+					'username',
+					loginForm.value.username
+				)
+				window.localStorage.setItem(
+					'password',
+					loginForm.value.password
+				)
+				window.localStorage.setItem('rememberMe', rememberMe.value)
+			} else {
+				window.localStorage.setItem('username', '')
+				window.localStorage.setItem('password', '')
+				window.localStorage.setItem('tenantId', '')
+				window.localStorage.setItem('rememberMe', false)
 			}
 			proxy.$router.push('/main')
 		}
 	})
-};
+}
 onMounted(() => {
 	let username = window.localStorage.getItem('username')
 	let password = window.localStorage.getItem('password')
 	let tenantId = window.localStorage.getItem('tenantId')
 	let rememberMeCopy = window.localStorage.getItem('rememberMe')
-	if(rememberMeCopy == 'true'){
+	if (rememberMeCopy == 'true') {
 		loginForm.value.username = username
 		loginForm.value.password = password
 		rememberMe.value = true
 		loginForm.value.tenantId = tenantId
 	}
 })
-alert(route.query.id)
+const loginData = ref({})
 let code = ref('')
 const ddLoginInit = () => {
-	
 	dd.ready(function () {
 		dd.runtime.permission.requestAuthCode({
 			corpId: route.query.id, // 企业id
 			onSuccess: function (info) {
-				code = info.code
-				alert(code)
+				code.value = info.code
+				proxy
+					.post('/open/dingApi/getUserToken', { code: code.value,corpId:route.query.id })
+					.then((res) => {
+						loginData.value = res
+						alert(JSON.stringify(res))
+					})
 			},
 			onFail: function (err) {
-				alert(JSON.stringify(err));
-			}
-		});
-	});			
+				alert(JSON.stringify(err))
+				
+			},
+		})
+	})
 }
-//ddLoginInit()
+ddLoginInit()
 
+const a = {
+	EventType: 'SYNC_HTTP_PUSH_HIGH',
+	bizData: [
+		{
+			gmt_create: 1683253790000,
+			biz_type: 2,
+			open_cursor: 0,
+			subscribe_id: '30319001_0',
+			id: 19780,
+			gmt_modified: 1683253790000,
+			biz_id: '30319001',
+			biz_data:
+				'{"eventId":"443aea2dc1f740d4bb8b4f629a8141b7","syncAction":"suite_ticket","suiteTicket":"Kn3hJvJR34e8rUEob0W7nqxK2YHqobAyPsuIQXYR35SsJMp6rE5XQBz9nwXTrJRZaVmXc4z9KjYkzXdkUdS8O3","syncSeq":"8506A9FE673B908159397DC8"}',
+			corp_id: 'ding53d823e205604918a39a90f97fcb1e09',
+			status: 0,
+		},
+	],
+}
 </script>

+ 2 - 2
src/views/procurementManagement/priceConfig/add.vue

@@ -29,7 +29,7 @@
           <!-- 明细列表 -->
           <div v-for="(item, index) in list" :key="index">
             <div class="row commons-item-title-delete">
-              <div class="title">明细{{ index + 1 }}</div>
+              <div class="title">供应物品 {{ index + 1 }}</div>
               <div
                 class="delete"
                 @click.native="handleDel(index)"
@@ -52,7 +52,7 @@
             <van-field
               v-model="list[index].price"
               label="供应单价"
-              placeholder="请输入供应单价"
+              placeholder="请输入"
               :rules="[{ required: true, message: '供应单价不能为空' }]"
               required
             />

+ 1 - 1
src/views/procurementManagement/priceConfig/index.vue

@@ -10,7 +10,7 @@
     </van-nav-bar>
     <van-search
       v-model="req.keyword"
-      placeholder="请输入搜索关键词"
+      placeholder="请输入关键词"
       @search="onRefresh"
     />
     <van-pull-refresh v-model="loading" @refresh="onRefresh">

+ 304 - 0
src/views/product-material/material-library/add copy.vue

@@ -0,0 +1,304 @@
+<template>
+  <div class="form">
+    <van-nav-bar title="物料库" left-text="返回" left-arrow @click-left="onClickLeft"> </van-nav-bar>
+    <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px; overflow-y: auto">
+      <van-cell-group inset>
+        <van-field
+          v-model="formData.productClassifyName"
+          is-link
+          readonly
+          label="物料分类"
+          placeholder="请选择物料分类"
+          @click="show = true"
+          :rules="[{ required: true, message: '物料分类不能为空' }]"
+          required />
+        <van-popup v-model:show="show" round position="bottom">
+          <van-cascader
+            title="请选择物料分类"
+            :options="classification"
+            :field-names="fieldNames"
+            @close="show = false"
+            @change="onChange"
+            @finish="onFinish" />
+        </van-popup>
+        <van-field
+          v-model="formData.typeName"
+          is-link
+          readonly
+          label="物料类型"
+          placeholder="选择物料类型"
+          @click="typeModal = true"
+          :rules="[{ required: true, message: '物料类型不能为空' }]"
+          required />
+        <van-popup v-model:show="typeModal" round position="bottom">
+          <van-picker :columns="typeList" @cancel="typeModal = false" @confirm="onConfirmType" />
+        </van-popup>
+        <van-field
+          v-model="formData.name"
+          name="物料名称"
+          label="物料名称"
+          placeholder="请填写物料名称"
+          :rules="[{ required: true, message: '物料名称不能为空' }]"
+          required />
+        <van-field
+          v-model="formData.spec"
+          name="规格型号"
+          label="规格型号"
+          placeholder="请填写规格型号"
+          :rules="[{ required: true, message: '规格型号不能为空' }]"
+          required />
+        <van-field
+          v-model="formData.unitName"
+          is-link
+          readonly
+          label="单位"
+          placeholder="选择单位"
+          @click="unitModal = true"
+          :rules="[{ required: true, message: '单位不能为空' }]"
+          required />
+        <van-popup v-model:show="unitModal" round position="bottom">
+          <van-picker :columns="unitList" @cancel="unitModal = false" @confirm="onConfirmUnit" />
+        </van-popup>
+        <van-field name="uploader" label="文件上传">
+          <template #input>
+            <van-uploader v-model="fileList" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024" @oversize="onOversize" />
+          </template>
+        </van-field>
+        <van-field v-model="formData.remark" rows="3" type="textarea" name="备注" label="备注" placeholder="请填写备注" />
+      </van-cell-group>
+      <div style="margin: 16px">
+        <van-button round block type="primary" native-type="submit"> 提交 </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>
+
+<script setup>
+import { ref, getCurrentInstance, onMounted } from "vue";
+import { showSuccessToast, showToast } from "vant";
+import { useRoute } from "vue-router";
+import { getUserInfo } from '@/utils/auth';
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const show = ref(false);
+const typeModal = ref(false);
+const unitModal = ref(false);
+const classification = ref([]);
+const fieldNames = {
+  text: "label",
+  value: "id",
+};
+const typeList = ref([
+  {
+    text: "原料",
+    value: "1",
+  },
+  {
+    text: "辅料",
+    value: "2",
+  },
+  {
+    text: "配件",
+    value: "3",
+  },
+  {
+    text: "包材",
+    value: "4",
+  },
+  {
+    text: "其他",
+    value: "5",
+  },
+]);
+const unitList = ref([]);
+
+const getDict = () => {
+  proxy
+    .post("/dictTenantData/page", {
+      pageNum: 1,
+      pageSize: 999,
+      tenantId: getUserInfo().tenantId,
+      dictCode: "unit",
+    })
+    .then((res) => {
+      unitList.value = res.data.rows.map((item, index) => {
+        return {
+          text: item.dictValue,
+          value: item.dictKey,
+        }
+      })
+    })
+}
+getDict()
+const formData = ref({
+  id: null,
+  definition: "2",
+  productClassifyId: null,
+  productClassifyName: null,
+  code: null,
+  customCode: null,
+  type: null,
+  typeName: null,
+  name: null,
+  spec: null,
+  unit: null,
+  remark: null,
+  fileList: [],
+});
+const onConfirmType = ({ selectedOptions }) => {
+  formData.value.type = selectedOptions[0].value;
+  formData.value.typeName = selectedOptions[0].text;
+  typeModal.value = false;
+};
+const onConfirmUnit = ({ selectedOptions }) => {
+  formData.value.unit = selectedOptions[0].value;
+  formData.value.unitName = selectedOptions[0].text;
+  unitModal.value = false;
+};
+const onChange = ({ selectedOptions }) => {
+  if (selectedOptions && selectedOptions.length > 0) {
+    formData.value.productClassifyId = selectedOptions[selectedOptions.length - 1].id;
+    formData.value.productClassifyName = selectedOptions[selectedOptions.length - 1].label;
+  }
+};
+const onFinish = ({ selectedOptions }) => {
+  show.value = false;
+  if (selectedOptions && selectedOptions.length > 0) {
+    formData.value.productClassifyId = selectedOptions[selectedOptions.length - 1].id;
+    formData.value.productClassifyName = selectedOptions[selectedOptions.length - 1].label;
+  }
+};
+const fileList = ref([]);
+const afterRead = (file) => {
+  if (file && file.length > 0) {
+    for (let i = 0; i < file.length; i++) {
+      file[i].status = "uploading";
+      file[i].message = "上传中...";
+      proxy.post("/fileInfo/getSing", { fileName: file[i].file.name }).then(
+        (res) => {
+          let forms = new FormData();
+          forms.append("file", file[i].file);
+          proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
+            () => {
+              file[i].id = res.data.id;
+              file[i].url = res.data.fileUrl;
+              file[i].fileName = res.data.fileName;
+              delete file[i].status;
+              delete file[i].message;
+            },
+            () => {
+              file[i].status = "failed";
+              file[i].message = "上传失败";
+            }
+          );
+        },
+        () => {
+          file[i].status = "failed";
+          file[i].message = "上传失败";
+        }
+      );
+    }
+  } else {
+    file.status = "uploading";
+    file.message = "上传中...";
+    proxy.post("/fileInfo/getSing", { fileName: file.file.name }).then(
+      (res) => {
+        let forms = new FormData();
+        forms.append("file", file.file);
+        proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
+          () => {
+            file.id = res.data.id;
+            file.url = res.data.fileUrl;
+            file.fileName = res.data.fileName;
+            delete file.status;
+            delete file.message;
+          },
+          () => {
+            file.status = "failed";
+            file.message = "上传失败";
+          }
+        );
+      },
+      () => {
+        file.status = "failed";
+        file.message = "上传失败";
+      }
+    );
+  }
+};
+const onOversize = () => {
+  showToast("文件大小不能超过 5MB");
+};
+const onClickLeft = () => history.back();
+const onSubmit = () => {
+  if (fileList.value && fileList.value.length > 0) {
+    formData.value.fileList = fileList.value.map((item) => {
+      return {
+        id: item.id,
+        fileName: item.fileName,
+      };
+    });
+  } else {
+    formData.value.fileList = [];
+  }
+  proxy.post("/productInfo/" + route.query.type, formData.value).then(() => {
+    showSuccessToast("添加成功");
+    setTimeout(() => {
+      history.back();
+    }, 500);
+  });
+};
+const treeToList = (arr) => {
+  let res = []; // 用于存储递归结果(扁平数据)
+  // 递归函数
+  let fn = (source) => {
+    source.forEach((el) => {
+      res.push(el);
+      el.children && el.children.length > 0 ? fn(el.children) : ""; // 子级递归
+    });
+  };
+  fn(arr);
+  return res;
+};
+onMounted(() => {
+  proxy.post("/productClassify/tree", { parentId: "", name: "", definition: "2" }).then((res) => {
+    classification.value = res.data;
+    let classList = treeToList(res.data);
+    if (route.query.id) {
+      proxy.post("/productInfo/detail", { id: route.query.id }).then((resDetail) => {
+        formData.value.id = route.query.id;
+        formData.value.productClassifyId = resDetail.data.productClassifyId;
+        let data = classList.filter((item) => item.id === resDetail.data.productClassifyId);
+        if (data && data.length > 0) {
+          formData.value.productClassifyName = data[0].label;
+        }
+        formData.value.code = resDetail.data.code;
+        formData.value.customCode = resDetail.data.customCode;
+        formData.value.type = resDetail.data.type;
+        let typeNameList = typeList.value.filter((item) => item.value == resDetail.data.type);
+        if (typeNameList && typeNameList.length > 0) {
+          formData.value.typeName = typeNameList[0].text;
+        }
+        formData.value.name = resDetail.data.name;
+        formData.value.spec = resDetail.data.spec;
+        formData.value.unitName = unitList.value.filter((item) => item.value == resDetail.data.unit)[0].text;
+        formData.value.remark = resDetail.data.remark;
+      });
+      proxy.post("/fileInfo/getList", { businessIdList: [route.query.id] }).then((res) => {
+        if (res.data[route.query.id] && res.data[route.query.id].length > 0) {
+          formData.value.fileList = res.data[route.query.id];
+          fileList.value = res.data[route.query.id].map((item) => {
+            return {
+              ...item,
+              url: item.fileUrl,
+            };
+          });
+        } else {
+          formData.value.fileList = [];
+          fileList.value = [];
+        }
+      });
+    }
+  });
+});
+</script>

+ 151 - 229
src/views/product-material/material-library/add.vue

@@ -1,115 +1,158 @@
 <template>
   <div class="form">
     <van-nav-bar title="物料库" left-text="返回" left-arrow @click-left="onClickLeft"> </van-nav-bar>
-    <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px; overflow-y: auto">
-      <van-cell-group inset>
-        <van-field
-          v-model="formData.productClassifyName"
-          is-link
-          readonly
-          label="物料分类"
-          placeholder="请选择物料分类"
-          @click="show = true"
-          :rules="[{ required: true, message: '物料分类不能为空' }]"
-          required />
-        <van-popup v-model:show="show" round position="bottom">
-          <van-cascader
-            title="请选择物料分类"
-            :options="classification"
-            :field-names="fieldNames"
-            @close="show = false"
-            @change="onChange"
-            @finish="onFinish" />
-        </van-popup>
-        <van-field
-          v-model="formData.typeName"
-          is-link
-          readonly
-          label="物料类型"
-          placeholder="选择物料类型"
-          @click="typeModal = true"
-          :rules="[{ required: true, message: '物料类型不能为空' }]"
-          required />
-        <van-popup v-model:show="typeModal" round position="bottom">
-          <van-picker :columns="typeList" @cancel="typeModal = false" @confirm="onConfirmType" />
-        </van-popup>
-        <van-field
-          v-model="formData.name"
-          name="物料名称"
-          label="物料名称"
-          placeholder="请填写物料名称"
-          :rules="[{ required: true, message: '物料名称不能为空' }]"
-          required />
-        <van-field
-          v-model="formData.spec"
-          name="规格型号"
-          label="规格型号"
-          placeholder="请填写规格型号"
-          :rules="[{ required: true, message: '规格型号不能为空' }]"
-          required />
-        <van-field
-          v-model="formData.unitName"
-          is-link
-          readonly
-          label="单位"
-          placeholder="选择单位"
-          @click="unitModal = true"
-          :rules="[{ required: true, message: '单位不能为空' }]"
-          required />
-        <van-popup v-model:show="unitModal" round position="bottom">
-          <van-picker :columns="unitList" @cancel="unitModal = false" @confirm="onConfirmUnit" />
-        </van-popup>
-        <van-field name="uploader" label="文件上传">
-          <template #input>
-            <van-uploader v-model="fileList" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024" @oversize="onOversize" />
-          </template>
-        </van-field>
-        <van-field v-model="formData.remark" rows="3" type="textarea" name="备注" label="备注" placeholder="请填写备注" />
-      </van-cell-group>
-      <div style="margin: 16px">
-        <van-button round block type="primary" native-type="submit"> 提交 </van-button>
-      </div>
-    </van-form>
+    <testForm
+      v-model="formData.data"
+      :formOption="formOption"
+      :formConfig="formConfig"
+      :rules="rules"
+      @onSubmit="onSubmit"
+      ref="formDom"
+    ></testForm>
   </div>
 </template>
 
 <script setup>
-import { ref, getCurrentInstance, onMounted } from "vue";
+import { ref, getCurrentInstance, onMounted,reactive } from "vue";
 import { showSuccessToast, showToast } from "vant";
 import { useRoute } from "vue-router";
 import { getUserInfo } from '@/utils/auth';
+import testForm from "@/components/testForm/index.vue";
 const proxy = getCurrentInstance().proxy;
 const route = useRoute();
 const show = ref(false);
 const typeModal = ref(false);
 const unitModal = ref(false);
 const classification = ref([]);
-const fieldNames = {
-  text: "label",
-  value: "id",
-};
-const typeList = ref([
+const formData = reactive({
+  data: {
+    id: null,
+    definition: "2",
+    productClassifyId: null,
+    productClassifyName: null,
+    code: null,
+    customCode: null,
+    type: null,
+    typeName: null,
+    name: null,
+    spec: null,
+    unit: null,
+    remark: null,
+    fileList: [],
+  },
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false, //用于控制整个表单是否只读
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  // hiddenSubmitBtn: true,
+});
+const formConfig = reactive([
+  {
+    type: "cascader",
+    label: "物料分类",
+    prop: "productClassifyId",
+    itemType: "common",
+    showPicker: false,
+    // data: classification.value,
+    data: [],
+    fieldNames: {
+      text: "label",
+      value: "id",
+      children: "children",
+    },
+    // onChangeFn: (option) => {
+    //   // console.log("aa");
+    // },
+    // finishFn: (current, option) => {
+    //   current.showPicker = false;
+    // },
+  },
+  {
+    type: "picker",
+    label: "物料类型",
+    prop: "type",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "text",
+      value: "value",
+    },
+    data: [
+      {
+        text: "原料",
+        value: "1",
+      },
+      {
+        text: "辅料",
+        value: "2",
+      },
+      {
+        text: "配件",
+        value: "3",
+      },
+      {
+        text: "包材",
+        value: "4",
+      },
+      {
+        text: "其他",
+        value: "5",
+      },
+    ],
+  },
   {
-    text: "原料",
-    value: "1",
+    type: "input",
+    itemType: "text",
+    label: "物料名称",
+    prop: "name",
+    clearable: true,
   },
   {
-    text: "辅料",
-    value: "2",
+    type: "input",
+    itemType: "text",
+    label: "规格型号",
+    prop: "spec",
+    clearable: true,
   },
   {
-    text: "配件",
-    value: "3",
+    type: "picker",
+    label: "单位",
+    prop: "unit",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "dictValue",
+      value: "dictKey",
+    },
+    data: []
   },
   {
-    text: "包材",
-    value: "4",
+    type: "upload",
+    label: "文件上传",
+    prop: "fileList",
   },
   {
-    text: "其他",
-    value: "5",
+    type: "input",
+    itemType: "textarea",
+    label: "备注",
+    prop: "remark",
   },
 ]);
+const rules = {
+  productClassifyId: [{ required: true, message: "产品分类不能为空" }],
+  type: [{ required: true, message: "产品类型不能为空" }],
+  name: [{ required: true, message: "产品名称不能为空" }],
+  spec: [{ required: true, message: "规格型号不能为空" }],
+  unit: [{ required: true, message: "单位不能为空" }],
+  select: [{ required: true, message: "请选择" }],
+  date: [{ required: true, message: "请选择时间" }],
+  common: [{ required: true, message: "请选择级联" }],
+  // city: [{ required: true, message: "请选择城市" }],
+};
 const unitList = ref([]);
 
 const getDict = () => {
@@ -121,127 +164,19 @@ const getDict = () => {
       dictCode: "unit",
     })
     .then((res) => {
-      unitList.value = res.data.rows.map((item, index) => {
-        return {
-          text: item.dictValue,
-          value: item.dictKey,
-        }
-      })
+      formConfig[4].data = res.data.rows
     })
 }
 getDict()
-const formData = ref({
-  id: null,
-  definition: "2",
-  productClassifyId: null,
-  productClassifyName: null,
-  code: null,
-  customCode: null,
-  type: null,
-  typeName: null,
-  name: null,
-  spec: null,
-  unit: null,
-  remark: null,
-  fileList: [],
-});
-const onConfirmType = ({ selectedOptions }) => {
-  formData.value.type = selectedOptions[0].value;
-  formData.value.typeName = selectedOptions[0].text;
-  typeModal.value = false;
-};
-const onConfirmUnit = ({ selectedOptions }) => {
-  formData.value.unit = selectedOptions[0].value;
-  formData.value.unitName = selectedOptions[0].text;
-  unitModal.value = false;
-};
-const onChange = ({ selectedOptions }) => {
-  if (selectedOptions && selectedOptions.length > 0) {
-    formData.value.productClassifyId = selectedOptions[selectedOptions.length - 1].id;
-    formData.value.productClassifyName = selectedOptions[selectedOptions.length - 1].label;
-  }
-};
-const onFinish = ({ selectedOptions }) => {
-  show.value = false;
-  if (selectedOptions && selectedOptions.length > 0) {
-    formData.value.productClassifyId = selectedOptions[selectedOptions.length - 1].id;
-    formData.value.productClassifyName = selectedOptions[selectedOptions.length - 1].label;
-  }
-};
 const fileList = ref([]);
-const afterRead = (file) => {
-  if (file && file.length > 0) {
-    for (let i = 0; i < file.length; i++) {
-      file[i].status = "uploading";
-      file[i].message = "上传中...";
-      proxy.post("/fileInfo/getSing", { fileName: file[i].file.name }).then(
-        (res) => {
-          let forms = new FormData();
-          forms.append("file", file[i].file);
-          proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
-            () => {
-              file[i].id = res.data.id;
-              file[i].url = res.data.fileUrl;
-              file[i].fileName = res.data.fileName;
-              delete file[i].status;
-              delete file[i].message;
-            },
-            () => {
-              file[i].status = "failed";
-              file[i].message = "上传失败";
-            }
-          );
-        },
-        () => {
-          file[i].status = "failed";
-          file[i].message = "上传失败";
-        }
-      );
-    }
-  } else {
-    file.status = "uploading";
-    file.message = "上传中...";
-    proxy.post("/fileInfo/getSing", { fileName: file.file.name }).then(
-      (res) => {
-        let forms = new FormData();
-        forms.append("file", file.file);
-        proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
-          () => {
-            file.id = res.data.id;
-            file.url = res.data.fileUrl;
-            file.fileName = res.data.fileName;
-            delete file.status;
-            delete file.message;
-          },
-          () => {
-            file.status = "failed";
-            file.message = "上传失败";
-          }
-        );
-      },
-      () => {
-        file.status = "failed";
-        file.message = "上传失败";
-      }
-    );
-  }
-};
 const onOversize = () => {
   showToast("文件大小不能超过 5MB");
 };
 const onClickLeft = () => history.back();
 const onSubmit = () => {
-  if (fileList.value && fileList.value.length > 0) {
-    formData.value.fileList = fileList.value.map((item) => {
-      return {
-        id: item.id,
-        fileName: item.fileName,
-      };
-    });
-  } else {
-    formData.value.fileList = [];
-  }
-  proxy.post("/productInfo/" + route.query.type, formData.value).then(() => {
+  console.log(formData)
+  
+  proxy.post("/productInfo/" + route.query.type, formData.data).then(() => {
     showSuccessToast("添加成功");
     setTimeout(() => {
       history.back();
@@ -262,42 +197,29 @@ const treeToList = (arr) => {
 };
 onMounted(() => {
   proxy.post("/productClassify/tree", { parentId: "", name: "", definition: "2" }).then((res) => {
-    classification.value = res.data;
+    formConfig[0].data = res.data;
     let classList = treeToList(res.data);
     if (route.query.id) {
       proxy.post("/productInfo/detail", { id: route.query.id }).then((resDetail) => {
-        formData.value.id = route.query.id;
-        formData.value.productClassifyId = resDetail.data.productClassifyId;
-        let data = classList.filter((item) => item.id === resDetail.data.productClassifyId);
-        if (data && data.length > 0) {
-          formData.value.productClassifyName = data[0].label;
-        }
-        formData.value.code = resDetail.data.code;
-        formData.value.customCode = resDetail.data.customCode;
-        formData.value.type = resDetail.data.type;
-        let typeNameList = typeList.value.filter((item) => item.value == resDetail.data.type);
-        if (typeNameList && typeNameList.length > 0) {
-          formData.value.typeName = typeNameList[0].text;
-        }
-        formData.value.name = resDetail.data.name;
-        formData.value.spec = resDetail.data.spec;
-        formData.value.unitName = unitList.value.filter((item) => item.value == resDetail.data.unit)[0].text;
-        formData.value.remark = resDetail.data.remark;
-      });
-      proxy.post("/fileInfo/getList", { businessIdList: [route.query.id] }).then((res) => {
-        if (res.data[route.query.id] && res.data[route.query.id].length > 0) {
-          formData.value.fileList = res.data[route.query.id];
-          fileList.value = res.data[route.query.id].map((item) => {
-            return {
-              ...item,
-              url: item.fileUrl,
-            };
-          });
-        } else {
-          formData.value.fileList = [];
-          fileList.value = [];
-        }
+        formData.data = resDetail.data
+        
       });
+      // proxy.post("/fileInfo/getList", { businessIdList: [route.query.id] }).then((res) => {
+      //   if (res.data[route.query.id] && res.data[route.query.id].length > 0) {
+      //     formData.value.fileList = res.data[route.query.id];
+      //     fileList.value = res.data[route.query.id].map((item) => {
+      //       return {
+      //         ...item,
+      //         url: item.fileUrl,
+      //       };
+      //     });
+      //   } else {
+      //     formData.value.fileList = [];
+      //     fileList.value = [];
+      //   }
+      // });
+    }else {
+      
     }
   });
 });

+ 6 - 7
src/views/product-material/product-library/add.vue

@@ -120,16 +120,16 @@ const formConfig = reactive([
   {
     type: "input",
     itemType: "textarea",
-    label: "富文本",
+    label: "备注",
     prop: "remark",
   },
 ]);
 const rules = {
-  name: [{ required: true, message: "请填写姓名" }],
-  password: [{ required: true, message: "请填写密码" }],
-  reamlke: [{ required: true, message: "请填写备注" }],
-  checkbox: [{ required: true, message: "请选择" }],
-  radio: [{ required: true, message: "请选择" }],
+  productClassifyId: [{ required: true, message: "产品分类不能为空" }],
+  type: [{ required: true, message: "产品类型不能为空" }],
+  name: [{ required: true, message: "产品名称不能为空" }],
+  spec: [{ required: true, message: "规格型号不能为空" }],
+  unit: [{ required: true, message: "单位不能为空" }],
   select: [{ required: true, message: "请选择" }],
   date: [{ required: true, message: "请选择时间" }],
   common: [{ required: true, message: "请选择级联" }],
@@ -147,7 +147,6 @@ const getDict = () => {
     })
     .then((res) => {
       formConfig[4].data = res.data.rows
-      formDom.value.formDataInit(true);
     })
 }
 getDict()