zhuangyunsheng vor 1 Jahr
Ursprung
Commit
b2b1529d44

+ 207 - 187
src/api/model/procurement.js

@@ -2,191 +2,211 @@ import config from "@/config"
 import http from "@/utils/request"
 
 export default {
-	contract: {
-		url: `${config.API_URL}/zcxt/supplierContract`,
-		name: "采购合同",
-
-		all: async function (data = {}) {
-			return await http.post(`${this.url}/getList`, data);
-		},
-
-		download: async function (params = {}) {
-			return await http.get(`${this.url}/download`, params, { responseType: "blob" });
-		}
-	},
-
-	plan: {
-		url: `${config.API_URL}/zcxt/purchasePlan`,
-		name: "招采计划",
-
-		getTongji: async function (data = {}) {
-			return await http.post(`${this.url}/getTongji`, data);
-		},
-
-		getSelectPage: async function (data = {}) {
-			return await http.post(`${this.url}/getSelectPage`, data);
-		},
-
-		get: async function (data = {}) {
-			return await http.post(`${this.url}/getPage`, data);
-		},
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		edit: async function (data = {}) {
-			return await http.post(`${this.url}/update`, data);
-		},
-
-		del: async function (data = {}) {
-			return await http.post(`${this.url}/remove`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	apply: {
-		url: `${config.API_URL}/zcxt/purchaseApply`,
-		name: "采购申请",
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		edit: async function (data = {}) {
-			return await http.post(`${this.url}/update`, data);
-		},
-
-		del: async function (data = {}) {
-			return await http.post(`${this.url}/remove`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	matter: {
-		url: `${config.API_URL}/zcxt/purchaseMatter`,
-		name: "采购申请-事项审批",
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	bidSign: {
-		url: `${config.API_URL}/zcxt/purchaseBidSign`,
-		name: "采购申请-招标文件会签",
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	answerSign: {
-		url: `${config.API_URL}/zcxt/purchaseAnswerSign`,
-		name: "采购申请-招标答疑会签",
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	bidNotice: {
-		url: `${config.API_URL}/zcxt/purchaseBidNotice`,
-		name: "采购申请-招标情况通知",
-
-		add: async function (data = {}) {
-			return await http.post(`${this.url}/save`, data);
-		},
-
-		detail: async function (data = {}) {
-			return await http.post(`${this.url}/getById`, data);
-		},
-
-		saveApprove: async function (data = {}) { // 审核
-			return await http.post(`${this.url}/saveApprove`, data);
-		},
-
-		resubmit: async function (data = {}) { // 重新发起
-			return await http.post(`${this.url}/resubmit`, data);
-		}
-	},
-
-	ledger: {
-		url: `${config.API_URL}/zcxt/purchase`,
-		name: "招采台账",
-
-		getTongji: async function (data = {}) {
-			return await http.post(`${this.url}/getTongji`, data);
-		},
-
-		get: async function (data = {}) {
-			return await http.post(`${this.url}/getPage`, data);
-		},
-
-		edit: async function (data = {}) {
-			return await http.post(`${this.url}/update`, data);
-		},
-
-		getBusinessId: async function (data = {}) {
-			return await http.post(`${this.url}/getBusinessId`, data);
-		}
-	}
+    contract: {
+        url: `${config.API_URL}/zcxt/supplierContract`,
+        name: "采购合同",
+
+        all: async function (data = {}) {
+            return await http.post(`${this.url}/getList`, data);
+        },
+
+        download: async function (params = {}) {
+            return await http.get(`${this.url}/download`, params, { responseType: "blob" });
+        }
+    },
+
+    plan: {
+        url: `${config.API_URL}/zcxt/purchasePlan`,
+        name: "招采计划",
+
+        getTongji: async function (data = {}) {
+            return await http.post(`${this.url}/getTongji`, data);
+        },
+
+        getSelectPage: async function (data = {}) {
+            return await http.post(`${this.url}/getSelectPage`, data);
+        },
+
+        get: async function (data = {}) {
+            return await http.post(`${this.url}/getPage`, data);
+        },
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        edit: async function (data = {}) {
+            return await http.post(`${this.url}/update`, data);
+        },
+
+        updateFile: async function (data = {}) { // 审批过程中修改文件
+            return await http.post(`${this.url}/updateFile`, data);
+        },
+
+        del: async function (data = {}) {
+            return await http.post(`${this.url}/remove`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    apply: {
+        url: `${config.API_URL}/zcxt/purchaseApply`,
+        name: "采购申请",
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        edit: async function (data = {}) {
+            return await http.post(`${this.url}/update`, data);
+        },
+
+        updateFile: async function (data = {}) { // 审批过程中修改文件
+            return await http.post(`${this.url}/updateFile`, data);
+        },
+
+        updatePurchase: async function (data = {}) { // 是否公用
+            return await http.post(`${this.url}/updatePurchase`, data);
+        },
+
+        del: async function (data = {}) {
+            return await http.post(`${this.url}/remove`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    matter: {
+        url: `${config.API_URL}/zcxt/purchaseMatter`,
+        name: "采购申请-事项审批",
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    bidSign: {
+        url: `${config.API_URL}/zcxt/purchaseBidSign`,
+        name: "采购申请-招标文件会签",
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        updateFile: async function (data = {}) { // 审批过程中修改文件
+            return await http.post(`${this.url}/updateFile`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    answerSign: {
+        url: `${config.API_URL}/zcxt/purchaseAnswerSign`,
+        name: "采购申请-招标答疑会签",
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        updateFile: async function (data = {}) { // 审批过程中修改文件
+            return await http.post(`${this.url}/updateFile`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    bidNotice: {
+        url: `${config.API_URL}/zcxt/purchaseBidNotice`,
+        name: "采购申请-招标情况通知",
+
+        add: async function (data = {}) {
+            return await http.post(`${this.url}/save`, data);
+        },
+
+        detail: async function (data = {}) {
+            return await http.post(`${this.url}/getById`, data);
+        },
+
+        saveApprove: async function (data = {}) { // 审核
+            return await http.post(`${this.url}/saveApprove`, data);
+        },
+
+        resubmit: async function (data = {}) { // 重新发起
+            return await http.post(`${this.url}/resubmit`, data);
+        }
+    },
+
+    ledger: {
+        url: `${config.API_URL}/zcxt/purchase`,
+        name: "招采台账",
+
+        getTongji: async function (data = {}) {
+            return await http.post(`${this.url}/getTongji`, data);
+        },
+
+        get: async function (data = {}) {
+            return await http.post(`${this.url}/getPage`, data);
+        },
+
+        edit: async function (data = {}) {
+            return await http.post(`${this.url}/update`, data);
+        },
+
+        getBusinessId: async function (data = {}) {
+            return await http.post(`${this.url}/getBusinessId`, data);
+        }
+    }
 }

+ 152 - 46
src/components/scChengTou/purchase/apply.vue

@@ -1,12 +1,10 @@
 <template>
 	<scTitle v-if="isIframe" class="iframe-detail-title">采购申请信息</scTitle>
-	<el-form v-loading="loading" :class="['dialog-form', disabled && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" :disabled="disabled" label-width="120px">
+    <el-form v-loading="loading" :class="['dialog-form', disabled && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" :disabled="disabled" label-width="120px">
 		<el-row :gutter="15">
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="采购所属项目:" prop="projectId">
-					<el-select v-model="form.projectId" filterable :disabled="form.id" placeholder="请选择采购所属项目" @change="projectChange">
-						<el-option v-for="item in projects" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
-					</el-select>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="采购申请名称:" prop="name">
+					<el-input v-model="form.name" placeholder="请输入采购申请名称"></el-input>
 				</el-form-item>
 			</el-col>
             <el-col :lg="lg" :md="12" :xs="24">
@@ -17,6 +15,18 @@
 					</el-radio-group>
 				</el-form-item>
 			</el-col>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="业务所属公司:" prop="belongDeptId">
+					<tree-select v-model="form.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly :disabled="form.id" placeholder="请选择业务所属公司" @change="deptChange"></tree-select>
+				</el-form-item>
+			</el-col>
+			<el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="采购所属项目:" prop="projectId">
+					<el-select v-model="form.projectId" filterable :disabled="!form.belongDeptId || form.id" placeholder="请选择采购所属项目" @change="projectChange">
+						<el-option v-for="item in deptProject" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="采购计划引入:">
 					<sc-table-select v-model="tableSelect.modelValue" :apiObj="tableSelect.apiObj" apiKey="getSelectPage" :params="tableSelect.params" :table-width="840" :props="tableSelect.props" :disabled="!form.projectId || !form.isInPlan || form.id" clearable placeholder="请选择采购计划" placement="bottom" @change="tableSelectChange">
@@ -51,11 +61,6 @@
 					</sc-table-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="采购申请名称:" prop="name">
-					<el-input v-model="form.name" placeholder="请输入采购申请名称"></el-input>
-				</el-form-item>
-			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="采购类别:" prop="type">
 					<dict-select ref="dictSelect" v-model="form.type" dic="procurement_category" filterable placeholder="请选择采购类别" @change="typeChange"></dict-select>
@@ -66,29 +71,24 @@
 					<dict-select v-model="form.specialFeeType" dic="special_expenses_type" filterable placeholder="请选择专项费用类型"></dict-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="公司/部门名称:">
-					<tree-select ref="deptTreeSelect" v-model="form.deptId" :apiObj="$API.system.dept" isDept disabled></tree-select>
-				</el-form-item>
-			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
+            <el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="招采类型:" prop="purchaseType">
 					<dict-select v-model="form.purchaseType" dic="procurement_type" filterable placeholder="请选择招采类型"></dict-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="业务所属公司:" prop="belongDeptId">
-					<tree-select v-model="form.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly placeholder="请选择业务所属公司"></tree-select>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="创建人:">
+					<el-input v-model="form.createName" disabled></el-input>
 				</el-form-item>
 			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="创建人:">
-					<el-input v-model="form.createName" disabled></el-input>
+				<el-form-item label="发起人所属公司:">
+					<tree-select ref="deptTreeSelect" v-model="form.deptId" :apiObj="$API.system.dept" isDept disabled></tree-select>
 				</el-form-item>
 			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="资金来源:">
-					<el-input v-model="form.fundSource" clearable placeholder="请输入资金来源"></el-input>
+					<dict-select v-model="form.fundSource" dic="fund_source" filterable clearable placeholder="请选择资金来源"></dict-select>
 				</el-form-item>
 			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
@@ -99,7 +99,7 @@
 			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="是否共用:">
-					<el-radio-group v-model="form.isShare">
+					<el-radio-group v-model="form.isShare" disabled>
 						<el-radio label="是" :value="0"></el-radio>
 						<el-radio label="否" :value="1"></el-radio>
 					</el-radio-group>
@@ -130,6 +130,43 @@
 			</el-col>
 		</el-row>
 	</el-form>
+
+    <el-form v-loading="loading" :class="['dialog-form', !updateFolder && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" label-width="120px">
+		<el-row>
+			<el-col :xs="24">
+                <el-form-item label="初稿:">
+                    <sc-upload-file v-model="form.folders['purchase/first'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24">
+                <el-form-item label="终稿:">
+                    <sc-upload-file v-model="form.folders['purchase/final'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24">
+                <el-form-item label="扫描件:">
+                    <sc-upload-file v-model="form.folders['purchase/print'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24" v-if="isIframe && form.status == 'approve'">
+                <el-form-item class="iframe-item__btn" label-width="0">
+                    <template v-if="updateFolder">
+                        <el-button @click="updateFolder = !updateFolder">取 消</el-button>
+                        <el-button type="primary" :loading="isSaveing" @click="submit">确 定</el-button>
+                    </template>
+                    <template v-else>
+                        <el-button type="primary" @click="updateFolder = !updateFolder">编 辑</el-button>
+                    </template>
+                </el-form-item>
+			</el-col>
+		</el-row>
+	</el-form>
 </template>
 
 <script>
@@ -149,10 +186,12 @@
 		data() {
 			return {
 				loading: false,
+                isSaveing: false,
+                updateFolder: !this.disabled,
 				projects: [],
 				tableSelect: {
 					apiObj: this.$API.procurement.plan,
-					params: { deptIdIn: this.$TOOL.data.get("USER_INFO").deptIdList, status: "done" },
+					params: { status: "done" },
 					props: { label: "planName" },
 					modelValue: null
 				},
@@ -177,10 +216,20 @@
 					isShare: 1,
                     isLawyer: 0,
 					suggestion: null,
+                    status: null,
 					folders: {
 						"purchase/apply": {
 							entities: []
-						}
+						},
+                        "purchase/first": {
+                            entities: []
+                        },
+                        "purchase/final": {
+                            entities: []
+                        },
+                        "purchase/print": {
+                            entities: []
+                        }
 					},
                     purchaseLaw: null
 				},
@@ -199,6 +248,10 @@
         computed: {
 			isEngineering() {
 				return this.formatType(this.form.type) == "工程类";
+            },
+
+            deptProject() {
+                return this.projects.filter(p => p.deptId == this.form.belongDeptId);
             }
         },
 
@@ -233,7 +286,8 @@
 					const { purchase } = await this.$API.procurement.apply.detail({ id: this.id });
 					this.loading = false;
 					for (const key in this.form) {
-						if (key == "isInPlan") this.form[key] = purchase[key];
+						if (key == "isInPlan") this.form[key] = !!purchase[key];
+						else if (key == "isShare") this.form[key] = purchase[key];
 						else if (key == "isLawyer") this.form[key] = !!purchase[key] && 1 || 0;
 						else if (key == "purchaseLaw") {
                             if (purchase.isLawyer == 1) {
@@ -242,11 +296,9 @@
                             } else this.form[key] = null;
                         } else if (key == "folders") {
 							if (purchase[key]) {
-								this.form[key] = {
-									"purchase/apply": {
-										entities: purchase[key]["purchase/apply"].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path }))
-									}
-								}
+                                for (const folder_key in this.form[key]) {
+                                    this.form[key][folder_key]["entities"] = purchase[key][folder_key].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path })) || []
+                                }
 							}
 						} else {
 							this.form[key] = purchase[key] || null;
@@ -259,30 +311,62 @@
 			},
 
 			tableSelectChange(e) {
-				this.form.planId = e && e.id || null;
-				this.form.planName = e && e.planName || null;
-				this.form.belongDeptId = e && e.belongDeptId || null;
-				this.form.type = e && e.type || null;
-				this.form.budgetAmount = e && e.budgetAmount || null;
-				this.form.projectId = e && e.projectId || null;
-				this.form.projectNo = e && e.projectNo || null;
+                if (e) {
+					this.form.planId = e.id;
+					this.form.planName = e.name;
+					this.form.type = e.type;
+					this.form.budgetAmount = e.budgetAmount;
+				} else {
+					this.form.planId = null;
+					this.form.planName = null;
+				}
 			},
 
+            deptChange() {
+                this.form.projectId = null;
+                this.projectChange();
+            },
+
 			projectChange(e) {
 				this.form.projectNo = this.projects.find(p => p.id == e) && this.projects.find(p => p.id == e).projectNo || null;
 				this.tableSelect.params.projectId = e;
+                this.radioChange();
 			},
 
             radioChange(e) {
                 if (!e) {
                     this.tableSelect.modelValue = null;
-                    this.form.planId = null;
-                    this.form.planName = null;
+                    this.tableSelectChange();
                 }
             },
 
             typeChange() {
                 if (this.isEngineering) this.form.specialFeeType = null;
+            },
+
+            submit() {
+                const data = {};
+				for (const key in this.form) {
+					if (key == "folders") {
+                        for (const folder_key in this.form[key]) {
+                            const applyFiles = this.form[key][folder_key]["entities"].filter(item => !item.id).map(item => item.path);
+                            if (applyFiles.length) {
+                                if (!data[key]) data[key] = {};
+                                data[key][folder_key] = {
+                                    entities: applyFiles.map(ticket => ({ features: { ticket } }))
+                                }
+                            }
+                        }
+					} else data[key] = this.form[key];
+				}
+
+                this.isSaveing = true;
+				this.$API.procurement.apply.updateFile(data).then(() => {
+					this.isSaveing = false;
+					this.$message.success("操作成功");
+					this.updateFolder = !this.updateFolder;
+                    this.setData();
+				}).catch(() => this.isSaveing = false);
             }
 		}
 	}
@@ -290,26 +374,48 @@
 
 <style lang="scss" scoped>
 .dialog-form {
-  padding: 10px 30px 10px 20px;
+  padding: 10px 30px 0 20px;
 
   .input-number-suffix {
     position: absolute;
     right: 30px;
     color: #262626;
   }
+
+  .iframe-item__btn :deep(.el-form-item__content) {
+    justify-content: flex-end;
+  }
 }
 
 .dialog-form-disabled {
-  padding-bottom: 20px;
+  :deep(.sc-upload-file) {
+    .el-upload {
+      display: none;
+    }
 
-  :deep(.sc-upload-file) .el-upload {
-    display: none;
+    .el-upload-list.is-disabled {
+      margin-top: 0;
+    }
   }
 }
 
+.dialog-form + .dialog-form {
+  padding-top: 0;
+  padding-bottom: 10px;
+}
+
+.dialog-form-disabled + .dialog-form {
+  padding-bottom: 20px;
+}
+
 @media (max-width: 992px) {
   .dialog-form {
-    padding: 10px;
+    padding: 10px 10px 0;
+  }
+
+  .dialog-form + .dialog-form {
+    padding-top: 0;
+    padding-bottom: 10px;
   }
 }
 </style>

+ 150 - 21
src/components/scChengTou/purchase/handler.vue

@@ -14,6 +14,11 @@
 					</el-select>
 				</el-form-item>
 			</el-col>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="业务所属公司:">
+					<tree-select v-model="apply.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept disabled placeholder="自动带出"></tree-select>
+				</el-form-item>
+			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="采购所属项目:">
 					<el-select v-model="apply.projectId" disabled placeholder="若为项目采购需填写, 自动带出">
@@ -26,9 +31,9 @@
 					<dict-select ref="dictSelect" v-model="apply.type" dic="procurement_category" disabled placeholder="自动带出"></dict-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="公司/部门名称:">
-					<tree-select v-model="apply.deptId" :apiObj="$API.system.dept" isDept disabled placeholder="自动带出"></tree-select>
+            <el-col v-if="apply.type && !isEngineering" :lg="lg" :md="12" :xs="24">
+				<el-form-item label="专项费用类型:" prop="specialFeeType">
+					<dict-select v-model="apply.specialFeeType" dic="special_expenses_type" disabled placeholder="自动带出"></dict-select>
 				</el-form-item>
 			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
@@ -36,11 +41,6 @@
 					<dict-select v-model="apply.purchaseType" dic="procurement_type" disabled placeholder="自动带出"></dict-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="业务所属公司:">
-					<tree-select v-model="apply.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept disabled placeholder="自动带出"></tree-select>
-				</el-form-item>
-			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="创建人:" prop="createId">
 					<sc-table-select v-model="form.person" :apiObj="tableSelect.apiObj" :table-width="840" :props="tableSelect.props" disabled placeholder="请选择创建人" placement="bottom">
@@ -65,7 +65,26 @@
 					</sc-table-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="发起人所属公司:">
+					<tree-select v-model="apply.deptId" :apiObj="$API.system.dept" isDept disabled placeholder="自动带出"></tree-select>
+				</el-form-item>
+			</el-col>
+            <!-- 金额 -->
+			<template v-if="mode == 'purchase_matter'">
+                <el-col :lg="lg" :md="12" :xs="24">
+                    <el-form-item label="成交金额:">
+                        <el-input-number v-model="apply.budgetAmount" :precision="2" :step="0.1" disabled :controls="false" placeholder="自动带出"></el-input-number>
+                        <span class="input-number-suffix">元</span>
+                    </el-form-item>
+                </el-col>
+                <el-col :lg="lg" :md="12" :xs="24">
+                    <el-form-item label="金额大写:">
+                        <el-input v-model="apply.budgetAmountDx" disabled placeholder="自动带出"></el-input>
+                    </el-form-item>
+                </el-col>
+            </template>
+			<el-col v-else :lg="lg" :md="12" :xs="24">
 				<el-form-item v-if="mode == 'purchase_bid_notice'" label="中标金额:" prop="bidAmount">
 					<el-input-number v-model="form.bidAmount" :precision="2" :step="0.1" :controls="false" placeholder="请输入中标金额"></el-input-number>
 					<span class="input-number-suffix">元</span>
@@ -75,6 +94,7 @@
 					<span class="input-number-suffix">元</span>
 				</el-form-item>
 			</el-col>
+            <!-- 金额 -->
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item v-if="mode == 'purchase_bid_notice'" label="中标单位:" prop="supplierId">
 					<el-select v-model="form.supplierId" filterable multiple placeholder="请选择中标单位" @change="supplierChange">
@@ -128,6 +148,45 @@
 			</el-col>
 		</el-row>
 	</el-form>
+
+    <template v-if="mode == 'purchase_bid_sign' || mode == 'purchase_answer_sign'">
+        <el-form v-loading="loading" :class="['dialog-form', !updateFolder && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" label-width="140px">
+            <el-row>
+                <el-col :xs="24">
+                    <el-form-item :class="!updateFolder && 'no-upload-btn'" label="初稿:">
+                        <sc-upload-file v-model="form.folders[`${handlerKey('lowercase')}/first`].entities" :limit="10" :disabled="!updateFolder">
+                            <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                        </sc-upload-file>
+                    </el-form-item>
+                </el-col>
+                <el-col :xs="24">
+                    <el-form-item :class="!updateFolder && 'no-upload-btn'" label="终稿:">
+                        <sc-upload-file v-model="form.folders[`${handlerKey('lowercase')}/final`].entities" :limit="10" :disabled="!updateFolder">
+                            <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                        </sc-upload-file>
+                    </el-form-item>
+                </el-col>
+                <el-col :xs="24">
+                    <el-form-item :class="!updateFolder && 'no-upload-btn'" label="扫描件:">
+                        <sc-upload-file v-model="form.folders[`${handlerKey('lowercase')}/print`].entities" :limit="10" :disabled="!updateFolder">
+                            <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                        </sc-upload-file>
+                    </el-form-item>
+                </el-col>
+                <el-col :xs="24" v-if="isIframe && form.status == 'approve'">
+                    <el-form-item class="iframe-item__btn" label-width="0">
+                        <template v-if="updateFolder">
+                            <el-button @click="updateFolder = !updateFolder">取 消</el-button>
+                            <el-button type="primary" :loading="isSaveing" @click="submit">确 定</el-button>
+                        </template>
+                        <template v-else>
+                            <el-button type="primary" @click="updateFolder = !updateFolder">编 辑</el-button>
+                        </template>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+    </template>
 </template>
 
 <script>
@@ -140,12 +199,14 @@
 			mode: { type: String, default: "purchase_matter" },
 			lg: { type: Number, default: 8 },
 			disabled: { type: Boolean, default: false },
-			isIframe: { type: Boolean, default: false }
+			isIframe: { type: Boolean, default: true }
 		},
 
 		data() {
 			return {
 				loading: false,
+                isSaveing: false,
+                updateFolder: !this.disabled,
 				stepDic,
 				projects: [],
 				suppliers: [],
@@ -160,8 +221,10 @@
 					deptId: null,
 					belongDeptId: null,
 					type: null,
+                    specialFeeType: null,
 					purchaseType: null,
 					budgetAmount: null,
+                    budgetAmountDx: null,
 					projectId: null
 				},
 				bidSign: {
@@ -182,6 +245,7 @@
 					bidPlatform: null,
 					bidAgency: null,
 					remark: null,
+                    status: null,
 					folders: {}
 				},
 				rules: {
@@ -195,6 +259,12 @@
 			}
 		},
 
+        computed: {
+			isEngineering() {
+				return this.formatType(this.apply.type) == "工程类";
+            }
+        },
+
 		created() {
 			this.form[`${this.handlerKey("suffix")}Name`] = null;
 			this.form.folders = {
@@ -202,6 +272,18 @@
 					entities: []
 				}
 			}
+            
+            if (this.mode == "purchase_bid_sign" || this.mode == "purchase_answer_sign") {
+                this.form.folders[`${this.handlerKey("lowercase")}/first`] = {
+					entities: []
+				}
+                this.form.folders[`${this.handlerKey("lowercase")}/final`] = {
+					entities: []
+				}
+                this.form.folders[`${this.handlerKey("lowercase")}/print`] = {
+					entities: []
+				}
+            }
 		},
 
 		mounted() {
@@ -220,6 +302,11 @@
 				return modeArray[0] + suffixArray.map(str => this.$TOOL.capitalizeWords(str)).join("");
 			},
 
+            formatType(value) {
+				const dicts = this.$refs.dictSelect && this.$refs.dictSelect.options || [];
+				return dicts && dicts.find(d => d.value == value) && dicts.find(d => d.value == value).label || "";
+			},
+
 			async getProjects() {
 				this.projects = await this.$API.system.project.all({ orderBy: "id_desc", projectStatus: "active" });
 			},
@@ -240,8 +327,13 @@
 					}
 
 					if (this.mode == "purchase_answer_sign") {
-						this.bidSign.folders = res.bidSign.folders["purchase/bidsign"].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path }))
-						if (this.bidSign.folders.length) this.$emit("hasFolders")
+                        let fileList = [];
+                        for (const key in res.bidSign.folders) {
+                            fileList = fileList.concat(res.bidSign.folders[key].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path })));
+                        }
+						this.bidSign.folders = fileList.slice();
+                        
+						if (fileList.length) this.$emit("hasFolders");
 					}
 	
 					if (res[this.handlerKey()].id) {
@@ -252,11 +344,9 @@
 						for (const key in this.form) {
 							if (key == "folders") {
 								if (model[key]) {
-									this.form[key] = {
-										[`purchase/${this.handlerKey("lowercase")}`]: {
-											entities: model[key][`purchase/${this.handlerKey("lowercase")}`].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path }))
-										}
-									}
+                                    for (const folder_key in this.form[key]) {
+                                        this.form[key][folder_key]["entities"] = model[key][folder_key].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path })) || []
+                                    }
 								}
 							} else if (key == "person") this.form[key] = { id: model.createId, nickName: model.createName };
 							else if (key == "supplierId") this.form[key] = model.bidCompanyIds && model.bidCompanyIds.split(",") || [];
@@ -271,20 +361,49 @@
 			supplierChange(e) {
 				this.form.bidCompanyIds = e && e.join() || null;
 				this.form.bidCompanyName = e && e.map(id => this.suppliers.find(s => s.id == id) && this.suppliers.find(s => s.id == id).supplierName || null).join() || null;
-			}
+			},
+
+            submit() {
+                const data = {};
+				for (const key in this.form) {
+					if (key == "folders") {
+                        for (const folder_key in this.form[key]) {
+                            const newFiles = this.form[key][folder_key]["entities"].filter(item => !item.id).map(item => item.path);
+                            if (newFiles.length) {
+                                if (!data[key]) data[key] = {};
+                                data[key][folder_key] = {
+                                    entities: newFiles.map(ticket => ({ features: { ticket } }))
+                                }
+                            }
+                        }
+					} else data[key] = this.form[key];
+				}
+
+                this.isSaveing = true;
+				this.$API.procurement[[this.handlerKey()]].updateFile(data).then(() => {
+					this.isSaveing = false;
+					this.$message.success("操作成功");
+					this.updateFolder = !this.updateFolder;
+                    this.setData();
+				}).catch(() => this.isSaveing = false);
+            }
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
 .dialog-form {
-  padding: 10px 30px 10px 10px;
+  padding: 10px 30px 0 20px;
 
   .input-number-suffix {
     position: absolute;
     right: 30px;
     color: #262626;
   }
+
+  .iframe-item__btn :deep(.el-form-item__content) {
+    justify-content: flex-end;
+  }
 }
 
 .no-upload-btn {
@@ -310,13 +429,23 @@
   }
 }
 
-.dialog-form-disabled {
+.dialog-form + .dialog-form {
+  padding-top: 0;
+  padding-bottom: 10px;
+}
+
+.dialog-form-disabled + .dialog-form {
   padding-bottom: 20px;
 }
 
 @media (max-width: 992px) {
   .dialog-form {
-    padding: 10px;
+    padding: 10px 10px 0;
+  }
+
+  .dialog-form + .dialog-form {
+    padding-top: 0;
+    padding-bottom: 10px;
   }
 }
 </style>

+ 135 - 24
src/components/scChengTou/purchase/plan.vue

@@ -2,10 +2,20 @@
 	<scTitle v-if="isIframe" class="iframe-detail-title">招采计划信息</scTitle>
 	<el-form v-loading="loading" :class="['dialog-form', disabled && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" :disabled="disabled" label-width="120px">
 		<el-row :gutter="15">
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="采购名称:" prop="planName">
+					<el-input v-model="form.planName" placeholder="请输入采购名称"></el-input>
+				</el-form-item>
+			</el-col>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="业务所属公司:" prop="belongDeptId">
+					<tree-select v-model="form.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly :disabled="form.id" placeholder="请选择业务所属公司" @change="deptChange"></tree-select>
+				</el-form-item>
+			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="采购所属项目:" prop="projectId">
-					<el-select v-model="form.projectId" filterable :disabled="form.id" placeholder="请选择采购所属项目" @change="projectChange">
-						<el-option v-for="item in hygh.projects" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+					<el-select v-model="form.projectId" filterable :disabled="!form.belongDeptId || form.id" placeholder="请选择采购所属项目" @change="projectChange">
+						<el-option v-for="item in deptProject" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
 					</el-select>
 				</el-form-item>
 			</el-col>
@@ -22,7 +32,7 @@
 									<el-col :md="9" :xs="24">
 										<el-form-item label="所属项目:">
 											<el-select class="left-option-select" v-model="hygh.params.projectCodes" :teleported="false" filterable multiple collapseTags placeholder="请选择所属项目">
-												<el-option v-for="item in hygh.projects" :key="item.id" :label="item.projectName" :value="item.projectNo"></el-option>
+												<el-option v-for="item in deptProject" :key="item.id" :label="item.projectName" :value="item.projectNo"></el-option>
 											</el-select>
 										</el-form-item>
 									</el-col>
@@ -61,21 +71,6 @@
 					</sc-table-select>
 				</el-form-item>
 			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="公司/部门名称:">
-					<tree-select v-model="form.deptId" :apiObj="$API.system.dept" isDept disabled></tree-select>
-				</el-form-item>
-			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="采购名称:" prop="planName">
-					<el-input v-model="form.planName" placeholder="请输入采购名称"></el-input>
-				</el-form-item>
-			</el-col>
-			<el-col :lg="lg" :md="12" :xs="24">
-				<el-form-item label="业务所属公司:" prop="belongDeptId">
-					<tree-select v-model="form.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly placeholder="请选择业务所属公司"></tree-select>
-				</el-form-item>
-			</el-col>
 			<el-col :lg="lg" :md="12" :xs="24">
 				<el-form-item label="采购类别:" prop="type">
 					<dict-select v-model="form.type" dic="procurement_category" filterable placeholder="请选择采购类别"></dict-select>
@@ -86,6 +81,11 @@
 					<el-input v-model="form.createName" disabled></el-input>
 				</el-form-item>
 			</el-col>
+            <el-col :lg="lg" :md="12" :xs="24">
+				<el-form-item label="发起人所属公司:">
+					<tree-select v-model="form.deptId" :apiObj="$API.system.dept" isDept disabled></tree-select>
+				</el-form-item>
+			</el-col>
 		</el-row>
 
 		<scTitle>采购信息</scTitle>
@@ -113,6 +113,43 @@
 			</el-col>
 		</el-row>
 	</el-form>
+
+	<el-form v-loading="loading" :class="['dialog-form', !updateFolder && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" label-width="120px">
+		<el-row>
+			<el-col :xs="24">
+                <el-form-item label="初稿:">
+                    <sc-upload-file v-model="form.folders['plan/first'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24">
+                <el-form-item label="终稿:">
+                    <sc-upload-file v-model="form.folders['plan/final'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24">
+                <el-form-item label="扫描件:">
+                    <sc-upload-file v-model="form.folders['plan/print'].entities" :limit="10" :disabled="!updateFolder">
+                        <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
+                    </sc-upload-file>
+                </el-form-item>
+			</el-col>
+            <el-col :xs="24" v-if="isIframe && form.status == 'approve'">
+                <el-form-item class="iframe-item__btn" label-width="0">
+                    <template v-if="updateFolder">
+                        <el-button @click="updateFolder = !updateFolder">取 消</el-button>
+                        <el-button type="primary" :loading="isSaveing" @click="submit">确 定</el-button>
+                    </template>
+                    <template v-else>
+                        <el-button type="primary" @click="updateFolder = !updateFolder">编 辑</el-button>
+                    </template>
+                </el-form-item>
+			</el-col>
+		</el-row>
+	</el-form>
 </template>
 
 <script>
@@ -135,6 +172,9 @@
 					value: "deptId"
 				},
 
+                loading: false,
+                isSaveing: false,
+                updateFolder: !this.disabled,
 				hygh: {
 					modelValue: null,
 					activeName: "contract",
@@ -165,7 +205,19 @@
 					budgetAmount: null,
 					enterDate: null,
 					beginDate: null,
-					endDate: null
+					endDate: null,
+                    status: null,
+                    folders: {
+                        "plan/first": {
+                            entities: []
+                        },
+                        "plan/final": {
+                            entities: []
+                        },
+                        "plan/print": {
+                            entities: []
+                        }
+                    }
 				},
 				rules: {
 					projectId: [{ required: true, message: "请选择采购所属项目" }],
@@ -178,8 +230,14 @@
 			}
 		},
 
+        computed: {
+            deptProject() {
+                return this.hygh.projects.filter(p => p.deptId == this.form.belongDeptId);
+            }
+        },
+
 		mounted() {
-			this.getProjects();
+            this.getProjects();
 			if (this.id) this.setData();
 		},
 
@@ -208,8 +266,16 @@
 					const { plan } = await this.$API.procurement.plan.detail({ id: this.id });
 					this.loading = false;
 					for (const key in this.form) {
-                        this.form[key] = plan[key] || null;
-                        if (key == "contractPlanId" && plan[key]) this.hygh.modelValue = { contractPlanId: plan[key], name: plan["contractPlanName"], code: plan["contractPlanCode"] }
+                        if (key == "folders") {
+							if (plan[key]) {
+                                for (const folder_key in this.form[key]) {
+                                    this.form[key][folder_key]["entities"] = plan[key][folder_key].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path })) || []
+                                }
+							}
+						} else {
+                            if (key == "contractPlanId" && plan[key]) this.hygh.modelValue = { contractPlanId: plan[key], name: plan["contractPlanName"], code: plan["contractPlanCode"] }
+                            this.form[key] = plan[key] || null;
+                        }
 					}
 				} catch (error) {
 					this.loading = false;
@@ -229,7 +295,6 @@
 					this.form.contractPlanName = e.name;
 					this.form.contractPlanCode = e.code;
 					this.form.budgetAmount = e.taxAmount;
-					this.form.projectId = e.projectId;
 					this.form.projectNo = this.hygh.projects.find(p => p.id == e.projectId) && this.hygh.projects.find(p => p.id == e.projectId).projectNo || null;
 					if (e.procurementTime) this.form.beginDate = moment(e.procurementTime).format("YYYY-MM-DD");
 				} else {
@@ -239,10 +304,42 @@
 				}
 			},
 
+            deptChange() {
+                this.form.projectId = null;
+                this.projectChange();
+            },
+
 			projectChange(e) {
+                this.hygh.modelValue = null;
 				this.form.projectNo = this.hygh.projects.find(p => p.id == e) && this.hygh.projects.find(p => p.id == e).projectNo || null;
 				this.hygh.params.projectCodes = this.form.projectNo && [this.form.projectNo] || [];
-			}
+                this.tableSelectChange();
+			},
+
+            submit() {
+                const data = {};
+				for (const key in this.form) {
+					if (key == "folders") {
+                        for (const folder_key in this.form[key]) {
+                            const planFiles = this.form[key][folder_key]["entities"].filter(item => !item.id).map(item => item.path);
+                            if (planFiles.length) {
+                                if (!data[key]) data[key] = {};
+                                data[key][folder_key] = {
+                                    entities: planFiles.map(ticket => ({ features: { ticket } }))
+                                }
+                            }
+                        }
+					} else data[key] = this.form[key];
+				}
+
+                this.isSaveing = true;
+				this.$API.procurement.plan.updateFile(data).then(() => {
+					this.isSaveing = false;
+					this.$message.success("操作成功");
+					this.updateFolder = !this.updateFolder;
+                    this.setData();
+				}).catch(() => this.isSaveing = false);
+            }
 		}
 	}
 </script>
@@ -260,10 +357,24 @@
     right: 30px;
     color: #262626;
   }
+
+  .iframe-item__btn :deep(.el-form-item__content) {
+    justify-content: flex-end;
+  }
 }
 
 .dialog-form-disabled {
   padding-bottom: 20px;
+
+  :deep(.sc-upload-file) {
+    .el-upload {
+      display: none;
+    }
+
+    .el-upload-list.is-disabled {
+      margin-top: 0;
+    }
+  }
 }
 
 .near-radio {

+ 2 - 3
src/components/scChengTou/treeSelect.vue

@@ -55,12 +55,11 @@
 			async loadNode({ level, data }, resolve) {
 				if (this.apiObj) {
 					if (level == 0) {
-                        const params = this.isAllDept && { deptType: "控股公司" } || {};
-                        const res = await this.apiObj[this.apiKey](params);
+                        const res = await this.apiObj[this.apiKey]();
 						this.treeList = config.parseData(res) || [];
                         
 						if (this.isDept) {
-                            if (this.isAllDept) resolve(this.treeList.filter(t => t.pid == 1));
+                            if (this.isAllDept) resolve(this.treeList.filter(t => t.pid == 1 && t.deptType == "控股公司"));
                             else resolve(this.treeList.filter(t => t.deptId == this.$TOOL.data.get("USER_INFO").deptId));
                         } else resolve(this.treeList.filter(t => t.pid == 0));
 						this.$emit("finished");

+ 2 - 2
src/views/procurement/ledger/index.vue

@@ -24,8 +24,8 @@
                 <el-form :model="params">
                     <el-row :gutter="15">
                         <el-col :lg="8" :md="12" :xs="24">
-                            <el-form-item label="所属组织:">
-                                <tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept check-strictly clearable placeholder="请选择所属组织"></tree-select>
+                            <el-form-item label="发起人所属公司:">
+                                <tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly clearable placeholder="请选择发起人所属公司"></tree-select>
                             </el-form-item>
                         </el-col>
                         <el-col :lg="8" :md="12" :xs="24">

+ 1 - 1
src/views/procurement/ledger/main.js

@@ -2,7 +2,7 @@ export const column = [
     { label: "采购申请编号", prop: "purchaseNo", width: "200", align: "center" },
     { label: "采购申请名称", prop: "name", width: "200", align: "center", showOverflowTooltip: true },
     { label: "合同信息", prop: "contract", width: "100", align: "center" },
-    { label: "所属组织", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
+    { label: "发起人所属公司", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
     { label: "业务所属公司", prop: "belongDeptName", width: "200", align: "center", showOverflowTooltip: true },
     { label: "项目名称", prop: "projectName", width: "200", align: "center", showOverflowTooltip: true },
     { label: "招采类型", prop: "purchaseType", width: "140", align: "center" },

+ 40 - 11
src/views/procurement/plan/index.vue

@@ -15,8 +15,8 @@
             <el-form :model="params">
                 <el-row :gutter="15">
 					<el-col :lg="8" :md="12" :xs="24">
-						<el-form-item label="所属组织:">
-							<tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept check-strictly clearable placeholder="请选择所属组织"></tree-select>
+						<el-form-item label="发起人所属公司:">
+							<tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly clearable placeholder="请选择发起人所属公司"></tree-select>
                         </el-form-item>
 					</el-col>
                     <el-col :lg="8" :md="12" :xs="24">
@@ -29,12 +29,28 @@
 						    <dict-select ref="dictSelect" v-model="params.type" dic="procurement_category" clearable placeholder="请选择采购类别"></dict-select>
                         </el-form-item>
                     </el-col>
+                    <el-col :lg="10" :md="12" :xs="24">
+                        <el-form-item class="amount-range-item" label="预算金额:">
+                            <el-input-number v-model="params.budgetAmountBegin" step-strictly :controls="false" placeholder="最小值"></el-input-number>-
+                            <el-input-number v-model="params.budgetAmountEnd" step-strictly :controls="false" placeholder="最大值"></el-input-number>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :lg="10" :md="16" :xs="24">
+                        <el-form-item label="计划开始日期:">
+                            <el-date-picker type="daterange" v-model="startDate" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"></el-date-picker>
+                        </el-form-item>
+                    </el-col>
                     <el-col :lg="10" :md="16" :xs="24">
+                        <el-form-item label="计划完成日期:">
+                            <el-date-picker type="daterange" v-model="endDate" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"></el-date-picker>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :lg="8" :md="16" :xs="24">
                         <el-form-item label="创建时间:">
                             <el-date-picker type="daterange" v-model="createDate" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"></el-date-picker>
                         </el-form-item>
                     </el-col>
-                    <el-col :md="8" :xs="24">
+                    <el-col :md="6" :xs="24">
                         <el-form-item>
                             <el-button @click="dateChange('month')">本月</el-button>
                             <el-button @click="dateChange('year')" >本年</el-button>
@@ -109,13 +125,11 @@ export default {
             column,
             api: this.$API.procurement.plan,
             params: {
-                orderBy: "createTime_desc",
-                deptIdIn: this.$TOOL.data.get("USER_INFO").deptIdList,
-                deptId: null,
-                planNameLike: null,
-                type: null
+                orderBy: "createTime_desc"
             },
             createDate: [],
+            startDate: [],
+            endDate: [],
 
             dialog: false
         }
@@ -166,7 +180,6 @@ export default {
 
         async getCensus() {
             const query = {
-                deptIdIn: this.$TOOL.data.get("USER_INFO").deptIdList,
                 yearCreateTimeBegin: moment().startOf("year").format("YYYY-MM-DD HH:mm:ss"),
                 yearCreateTimeEnd: moment().endOf("day").format("YYYY-MM-DD HH:mm:ss"),
                 monthCreateTimeBegin: moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"),
@@ -179,8 +192,13 @@ export default {
 
         // 本地更新数据
         reloadTable(mode = "add") {
+            this.params["beginDateBegin"] = this.startDate && this.startDate[0] && this.startDate[0] || "";
+            this.params["beginDateEnd"] = this.startDate && this.startDate[1] && this.startDate[1] || "";
+            this.params["endDateBegin"] = this.endDate && this.endDate[0] && this.endDate[0] || "";
+            this.params["endDateEnd"] = this.endDate && this.endDate[1] && this.endDate[1] || "";
             this.params["createTimeBegin"] = this.createDate && this.createDate[0] && (this.createDate[0] + " 00:00:00") || "";
             this.params["createTimeEnd"] = this.createDate && this.createDate[1] && (this.createDate[1] + " 23:59:59") || "";
+            
             const page = mode == "add" && 1 || this.$refs.table.currentPage;
             this.$refs.table.reload(this.params, page);
             (mode == "add" || mode == "edit") && this.getCensus();
@@ -188,8 +206,8 @@ export default {
 
         reset() {
             this.createDate = [];
-            for (const key in this.params) {
-                if (key != "orderBy") this.params[key] = null;
+            this.params = {
+                orderBy: "createTime_desc"
             }
 
             this.reloadTable();
@@ -239,6 +257,17 @@ export default {
       color: var(--el-color-primary);
     }
   }
+
+  .aminui-main-container__query-header {
+    .amount-range-item :deep(.el-form-item__content) {
+      display: flex;
+      justify-content: space-between;
+
+      .el-input-number {
+        flex-basis: 40%;
+      }
+    }
+  }
 }
 
 @media (max-width: 992px) {

+ 1 - 1
src/views/procurement/plan/main.js

@@ -9,7 +9,7 @@ export const column = [
     { label: "计划开始日期", prop: "beginDate", width: "140", align: "center" },
     { label: "计划完成日期", prop: "endDate", width: "140", align: "center" },
     { label: "进场日期", prop: "enterDate", width: "140", align: "center", hide: true },
-    { label: "采购公司/部门", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
+    { label: "发起人所属公司", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
     { label: "业务所属公司", prop: "belongDeptName", width: "200", align: "center", hide: true, showOverflowTooltip: true },
     { label: "采购所属项目", prop: "projectName", width: "200", align: "center", hide: true, showOverflowTooltip: true }
 ]

+ 9 - 8
src/views/procurement/process/detail.vue

@@ -90,14 +90,15 @@
 				const data = {};
 				for (const key in this.$refs.scApply.form) {
 					if (key == "folders") {
-						const applyFiles = this.$refs.scApply.form[key]["purchase/apply"].entities.filter(item => !item.id).map(item => item.path);
-						if (applyFiles.length) {
-							data[key] = {
-								"purchase/apply": {
-									entities: applyFiles.map(ticket => ({ features: { ticket } }))
-								}
-							};
-						}
+						for (const folder_key in this.$refs.scApply.form[key]) {
+                            const applyFiles = this.$refs.scApply.form[key][folder_key]["entities"].filter(item => !item.id).map(item => item.path);
+                            if (applyFiles.length) {
+                                if (!data[key]) data[key] = {};
+                                data[key][folder_key] = {
+                                    entities: applyFiles.map(ticket => ({ features: { ticket } }))
+                                }
+                            }
+                        }
 					} else data[key] = this.$refs.scApply.form[key];
 				}
 				if (templateId) data["templateId"] = templateId;

+ 9 - 8
src/views/procurement/process/handle.vue

@@ -105,14 +105,15 @@
 				const data = {};
 				for (const key in this.$refs.scHandler.form) {
 					if (key == "folders") {
-						const newFiles = this.$refs.scHandler.form[key][`purchase/${this.$refs.scHandler.handlerKey("lowercase")}`].entities.filter(item => !item.id).map(item => item.path);
-						if (newFiles.length) {
-							data[key] = {
-								[`purchase/${this.$refs.scHandler.handlerKey("lowercase")}`]: {
-									entities: newFiles.map(ticket => ({ features: { ticket } }))
-								}
-							};
-						}
+                        for (const folder_key in this.$refs.scHandler.form[key]) {
+                            const newFiles = this.$refs.scHandler.form[key][folder_key]["entities"].filter(item => !item.id).map(item => item.path);
+                            if (newFiles.length) {
+                                if (!data[key]) data[key] = {};
+                                data[key][folder_key] = {
+                                    entities: newFiles.map(ticket => ({ features: { ticket } }))
+                                }
+                            }
+                        }
 					} else data[key] = this.$refs.scHandler.form[key];
 				}
 				if (templateId) data["templateId"] = templateId;

+ 72 - 13
src/views/procurement/process/index.vue

@@ -4,8 +4,13 @@
             <el-form :model="params">
                 <el-row :gutter="15">
 					<el-col :lg="8" :md="12" :xs="24">
-						<el-form-item label="所属组织:">
-							<tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept check-strictly clearable placeholder="请选择所属组织"></tree-select>
+						<el-form-item label="发起人所属公司:">
+							<tree-select ref="deptTreeSelect" v-model="params.deptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly clearable placeholder="请选择发起人所属公司"></tree-select>
+                        </el-form-item>
+					</el-col>
+                    <el-col :lg="8" :md="12" :xs="24">
+						<el-form-item label="流水编号:">
+                            <el-input v-model="params.purchaseNoLike" clearable placeholder="请输入流水编号"></el-input>
                         </el-form-item>
 					</el-col>
                     <el-col :lg="8" :md="12" :xs="24">
@@ -18,6 +23,28 @@
 						    <dict-select ref="dictSelect" v-model="params.type" dic="procurement_category" clearable placeholder="请选择采购类别"></dict-select>
                         </el-form-item>
                     </el-col>
+                    <el-col :lg="10" :md="12" :xs="24">
+						<el-form-item label="计划内采购:">
+                            <el-select v-model="params.isInPlan" clearable placeholder="请选择是否计划内采购">
+                                <el-option label="是" :value="true"></el-option>
+                                <el-option label="否" :value="false"></el-option>
+                            </el-select>
+                        </el-form-item>
+					</el-col>
+                    <el-col :lg="10" :md="12" :xs="24">
+                        <el-form-item class="amount-range-item" label="预算金额:">
+                            <el-input-number v-model="params.budgetAmountBegin" step-strictly :controls="false" placeholder="最小值"></el-input-number>-
+                            <el-input-number v-model="params.budgetAmountEnd" step-strictly :controls="false" placeholder="最大值"></el-input-number>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :lg="10" :md="12" :xs="24">
+						<el-form-item label="外部律师选聘:">
+                            <el-select v-model="params.isLawyer" clearable placeholder="请选择是否外部律师选聘">
+                                <el-option label="是" :value="true"></el-option>
+                                <el-option label="否" :value="false"></el-option>
+                            </el-select>
+                        </el-form-item>
+					</el-col>
                     <el-col :lg="12" :md="16" :xs="24">
                         <el-form-item label="申请时间:">
                             <el-date-picker type="daterange" v-model="createDate" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"></el-date-picker>
@@ -67,11 +94,18 @@
                     <template #belongDeptName="scope">{{ formatDeptName(scope.row.belongDeptId) }}</template>
                     <template #projectName="scope">{{ formatProjectName(scope.row.projectId) }}</template>
                     <template #isLawyer="scope">{{ formatBoolean(scope.row.isLawyer) }}</template>
-
+                    
+                    <el-table-column label="是否共用" fixed="right" align="center" width="100">
+                        <template #default="scope">
+                            <!-- <template v-if="scope.row.bidNotice.processState == 'ENDED'"> -->
+                                <el-switch :model-value="scope.row.isShare" :loading="loading.share" :active-value="0" :inactive-value="1" @change="val => openShareChange(val, scope.row)"></el-switch>
+                            <!-- </template> -->
+                        </template>
+                    </el-table-column>
                     <el-table-column label="是否开启" fixed="right" align="center" width="100">
                         <template #default="scope">
                             <template v-if="scope.row.bidNotice.processState == 'ENDED'">
-                                <el-switch :model-value="scope.row.oaStatus" :loading="loading" :active-value="0" :inactive-value="1" @change="val => openChange(val, scope.row)"></el-switch>
+                                <el-switch :model-value="scope.row.oaStatus" :loading="loading.status" :active-value="0" :inactive-value="1" @change="val => openStatusChange(val, scope.row)"></el-switch>
                             </template>
                         </template>
                     </el-table-column>
@@ -130,7 +164,6 @@ export default {
             createDate: [],
             params: {
                 orderBy: "createTime_desc",
-                deptIdIn: this.$TOOL.data.get("USER_INFO").deptIdList,
                 deptId: null,
                 nameLike: null,
                 type: null
@@ -142,7 +175,10 @@ export default {
                 handle: false
             },
 
-            loading: false
+            loading: {
+                status: false,
+                share: false
+            }
         }
     },
 
@@ -302,25 +338,48 @@ export default {
             }).catch(() => {});
         },
 
+        // 是否共用
+        openShareChange(isShare, { id }) {
+            this.loading.share = true;
+            this.$API.procurement.apply.updatePurchase({ id, isShare }).then(() => {
+                this.loading.share = false;
+                this.$message.success("操作成功");
+                this.reloadTable("update");
+            }).catch(() => this.loading.share = false);
+        },
+
         // oa 情况通知-是否开启
-        openChange(status, { id, oaStatus }) {
+        openStatusChange(status, { id, oaStatus }) {
             if (status === 1 && (oaStatus === undefined || oaStatus === null)) return;
 
-            this.loading = true;
+            this.loading.status = true;
             this.$API.auth.oa.updateStatus({ id, status }).then(() => {
-                this.loading = false;
+                this.loading.status = false;
                 this.$message.success("操作成功");
                 this.reloadTable("update");
-            }).catch(() => this.loading = false);
+            }).catch(() => this.loading.status = false);
         }
     }
 }
 </script>
 
 <style lang="scss" scoped>
-.aminui-main-container .aminui-main-container__table-main .scTable {
-  :deep(.el-table__header) .el-checkbox {
-    display: none;
+.aminui-main-container {
+  .aminui-main-container__query-header {
+    .amount-range-item :deep(.el-form-item__content) {
+      display: flex;
+      justify-content: space-between;
+
+      .el-input-number {
+        flex-basis: 40%;
+      }
+    }
+  }
+
+  .aminui-main-container__table-main .scTable {
+    :deep(.el-table__header) .el-checkbox {
+      display: none;
+    }
   }
 }
 

+ 1 - 1
src/views/procurement/process/main.js

@@ -10,7 +10,7 @@ export const column = [
     { label: "预算金额 (元)", prop: "budgetAmount", width: "140", align: "center" },
     { label: "申请人", prop: "createName", width: "140", align: "center", hide: true },
     { label: "申请日期", prop: "createTime", width: "140", align: "center" },
-    { label: "采购公司/部门", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
+    { label: "发起人所属公司", prop: "deptName", width: "200", align: "center", showOverflowTooltip: true },
     { label: "业务所属公司", prop: "belongDeptName", width: "200", align: "center", hide: true, showOverflowTooltip: true },
     { label: "采购所属项目", prop: "projectName", width: "200", align: "center", hide: true, showOverflowTooltip: true },
     { label: "外部律师选聘", prop: "isLawyer", width: "120", align: "center" }

+ 11 - 2
src/views/supplier/signed/index.vue

@@ -67,6 +67,9 @@
 					<scTable class="scTable" ref="table" row-key="id" :apiObj="table.api" :params="table.params" :column="table.column" tableName="supplierTable" pageParams="current">
 						<el-table-column label="序号" type="index" align="center" width="60"></el-table-column>
                     	<template #supplierType="scope">{{ formatType(scope.row.supplierTypeId) }}</template>
+                    	<template #supplierName="scope">
+                            <el-link type="blue" @click="table_edit(scope.row, 'detail')">{{ scope.row.supplierName }}</el-link>
+                        </template>
 						<el-table-column label="操作" fixed="right" align="center" width="200">
 							<template #default="scope">
 								<el-button text @click="table_edit(scope.row)">编辑</el-button><el-divider direction="vertical" />
@@ -173,9 +176,9 @@
 			},
 
 			// 编辑供应商
-			table_edit(row) {
+			table_edit(row, mode = "edit") {
 				this.dialog = true;
-				this.$nextTick(() => this.$refs.supplierSave.open("edit").setData(row));
+				this.$nextTick(() => this.$refs.supplierSave.open(mode).setData(row));
 			},
 
 			// 删除供应商
@@ -236,6 +239,12 @@
       }
     }
   }
+
+  .el-link.el-link--blue {
+    --el-link-text-color: var(--el-color-blue);
+    --el-link-hover-text-color: var(--el-color-blue-light-3);
+    --el-link-disabled-text-color: var(--el-color-blue-light-5);
+  }
 }
 
 @media (max-width: 992px) {

+ 21 - 4
src/views/supplier/signed/save.vue

@@ -9,7 +9,7 @@
 
 		<el-main>
 			<el-scrollbar>
-				<el-form ref="dialogForm" :model="form" :rules="rules" label-width="140px">
+				<el-form :class="mode == 'detail' && 'dialog-form-disabled'" ref="dialogForm" :model="form" :rules="rules" :disabled="mode == 'detail'" label-width="140px">
 					<scTitle>基本信息</scTitle>
 					<el-row :gutter="15">
 						<el-col :lg="8" :md="12" :xs="24">
@@ -139,7 +139,7 @@
 					<el-row :gutter="15">
 						<el-col :xs="24">
 							<el-form-item prop="bankList" label-width="60px">
-								<sc-form-table ref="formTable" v-model="form.bankList" @rowAdd="table_add">
+								<sc-form-table ref="formTable" v-model="form.bankList" :hideAdd="mode == 'detail'" :hideDelete="mode == 'detail'" @rowAdd="table_add">
 									<el-table-column label="省名称" prop="provInputName" width="120" align="center"></el-table-column>
 									<el-table-column label="市名称" prop="name" width="120" align="center"></el-table-column>
 									<el-table-column label="联行号" prop="sysBankCode" min-width="130" align="center"></el-table-column>
@@ -155,6 +155,11 @@
 											<el-input v-model="scope.row.accountCode" placeholder="银行账号"></el-input>
 										</template>
 									</el-table-column>
+                                    <el-table-column label="账户属性" prop="accountNature" min-width="180">
+										<template #default="scope">
+                                            <dict-select v-model="scope.row.accountNature" dic="account_nature" filterable placeholder="账户属性"></dict-select>
+										</template>
+									</el-table-column>
 								</sc-form-table>
 							</el-form-item>
 						</el-col>
@@ -179,7 +184,7 @@
 			</el-scrollbar>
 		</el-main>
 
-		<el-footer>
+		<el-footer v-if="mode == 'add' || mode == 'edit'">
 			<el-button @click="$emit('closed')">取消</el-button>
 			<el-button type="primary" :loading="isSaveing" @click="submit">保存</el-button>
 		</el-footer>
@@ -253,7 +258,7 @@
 					nature: [{ required: true, message: "请选择单位性质" }],
 					bankList: [{ required: true, message: "请选择银行账户" },
 						{ validator: (rule, value, callback) => {
-							if (value.findIndex(v => !v.accountName || !v.accountCode) != -1) return callback(new Error("请完善银行账户信息"));
+							if (value.findIndex(v => !v.accountName || !v.accountCode || !v.accountNature) != -1) return callback(new Error("请完善银行账户信息"));
 							callback();
 						}}
 					]
@@ -423,6 +428,18 @@
         color: #262626;
       }
     }
+
+    .dialog-form-disabled {
+      :deep(.sc-upload-file) {
+        .el-upload {
+          display: none;
+        }
+
+        .el-upload-list.is-disabled {
+          margin-top: 0;
+        }
+      }
+    }
   }
 
   .el-footer {