diff --git a/deploy-tools/Jenkinsfile b/deploy-tools/Jenkinsfile index 9ae5223..ecf70f5 100644 --- a/deploy-tools/Jenkinsfile +++ b/deploy-tools/Jenkinsfile @@ -28,17 +28,17 @@ node("height_A") { switch(branch){ case 'developer' : hostPort = 22 - credentialsId = "scj-v3" + credentialsId = "root-with-key-ubu-70" remoteHost = "192.168.42.127" namespace = "scj-v3" profile = "developer" break; case 'master': hostPort = 22 - credentialsId = "city-zhxy-deploy" - remoteHost = "192.168.41.228" - namespace = "scj-v3" - profile = "deploy" + credentialsId = "root-with-key-ubu-70" + remoteHost = "192.168.43.18" + namespace = "city-zhxy-school-deploy-v3" + profile = "deploy" break; default: error('未配置分支!放弃执行') @@ -107,7 +107,7 @@ node("height_A") { remote.host = "${remoteHost}" remote.allowAnyHosts = true - withCredentials([sshUserPrivateKey(credentialsId: 'root-with-key-ubu-70', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'username')]) { + withCredentials([sshUserPrivateKey(credentialsId: "${credentialsId}", keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'username')]) { remote.user = "${username}" remote.port = hostPort remote.identityFile = identity @@ -122,6 +122,7 @@ node("height_A") { } + }catch(Exception e){ isSuccess = false currentBuild.result = 'FAILURE' diff --git a/package.json b/package.json index d5f89ce..424f19e 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,6 @@ "prettier": "prettier --write ." }, "dependencies": { - "file-saver": "^2.0.5", - "xlsx": "^0.18.5", "@axolo/json-editor-vue": "^0.3.2", "@chenfengyuan/vue-qrcode": "^2.0.0", "@element-plus/icons-vue": "^2.0.10", @@ -38,6 +36,7 @@ "driver.js": "^0.9.8", "echarts": "^5.4.1", "element-plus": "2.5.5", + "file-saver": "^2.0.5", "form-create-designer": "3.2.11-oem", "highlight.js": "^11.7.0", "html-to-image": "^1.11.13", @@ -46,6 +45,7 @@ "json-editor-vue3": "^1.1.1", "jsplumb": "2.15.6", "lodash": "^4.17.21", + "mammoth": "^1.11.0", "marked": "^12.0.2", "markmap-common": "0.15.6", "markmap-lib": "0.15.8", @@ -73,7 +73,8 @@ "vue-router": "4.1.6", "vue3-tree-org": "^4.2.2", "vue3-video-play": "1.3.1-beta.6", - "vuedraggable": "^4.1.0" + "vuedraggable": "^4.1.0", + "xlsx": "^0.18.5" }, "resolutions": { "@achrinza/node-ipc": "^11.0.0", diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue index 179cb7a..e456b13 100644 --- a/src/components/Upload/index.vue +++ b/src/components/Upload/index.vue @@ -503,7 +503,7 @@ const handlePreview = async (file: any) => { const ext = fileName.split('.').pop()?.toLowerCase() || ''; // 判断是否是图片 - const imageExts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp']; + const imageExts = ['png', 'jpg', 'jpeg']; // 判断是否是PDF const isPdf = ext === 'pdf'; diff --git a/src/views/purchase/purchasingrequisition/add.vue b/src/views/purchase/purchasingrequisition/add.vue index 90ec3a0..22c265e 100644 --- a/src/views/purchase/purchasingrequisition/add.vue +++ b/src/views/purchase/purchasingrequisition/add.vue @@ -1087,7 +1087,7 @@ const dataForm = reactive({ importApplication: '', governmentPurchaseIntent: '', servicePublicSelectSchool: '', - // 学校统一采购特殊规则字段(5万<=金额<40万) + // 学校统一采购特殊规则字段(5万<=金额<30万) serviceInviteSelectSchool: '', servicePublicSelectSchoolAuto: '', @@ -1285,9 +1285,12 @@ const schoolUnifiedPurchaseFormDisabled = computed(() => { // 特殊情况字典 value:0否 1紧急 2单一 3进口 const isUrgentSpecial = computed(() => dataForm.isSpecial === '1'); -// 是否为特殊情况(非0即为特殊情况:紧急、单一、进口) +// 是否为特殊情况(非0即为特殊情况:紧急、单一、进口)或预算金额>=30万 const isSpecialCase = computed(() => { - return dataForm.isSpecial && dataForm.isSpecial !== '0'; + // 特殊情况或预算金额>=30万时,需要选择校党委 + const isSpecial = dataForm.isSpecial && dataForm.isSpecial !== '0'; + const isHighBudget = dataForm.budget != null && dataForm.budget >= BUDGET_FEASIBILITY_THRESHOLD.value; + return isSpecial || isHighBudget; }); // 第二步标题 @@ -1418,7 +1421,7 @@ watch( { immediate: true } ); -// 判断是否自动选择网上商城采购方式(5万<=金额<40万,服务类目,特殊服务类目) +// 判断是否自动选择网上商城采购方式(5万<=金额<30万,服务类目,特殊服务类目) const isAutoSelectPurchaseType = computed(() => { if (!dataForm.budget) return false; const budget = dataForm.budget; @@ -1430,7 +1433,8 @@ const isAutoSelectPurchaseType = computed(() => { ); }); -// 判断是否显示自动邀请比选模版(5万<=金额<40万,服务类目,特殊服务类目) + +// 判断是否显示自动邀请比选模版(5万<=金额<30万,服务类目,特殊服务类目) const showAutoInviteSelect = computed(() => { if (!isDeptPurchase.value) return false; if (!dataForm.budget) return false; @@ -1443,7 +1447,7 @@ const showAutoInviteSelect = computed(() => { ); }); -// 判断是否显示学校统一采购的自动邀请比选模版(5万<=金额<40万,服务类目,特殊服务类目) +// 判断是否显示学校统一采购的自动邀请比选模版(5万<=金额<30万,服务类目,特殊服务类目) const showAutoInviteSelectSchool = computed(() => { if (isDeptPurchase.value) return false; if (!dataForm.budget) return false; @@ -1451,7 +1455,7 @@ const showAutoInviteSelectSchool = computed(() => { return budget >= BUDGET_DEPT_PURCHASE_THRESHOLD.value && budget < BUDGET_PUBLIC_SELECT_THRESHOLD.value && isSpecialServiceCategory.value; }); -// 判断是否显示自动公开比选模版(40万<=金额<100万,特殊服务类目:isMallService=1、isProjectService=1) +// 判断是否显示自动公开比选模版(30万<=金额<100万,特殊服务类目:isMallService=1、isProjectService=1) const showAutoPublicSelect = computed(() => { if (isDeptPurchase.value) return false; if (!dataForm.budget) return false; @@ -1473,7 +1477,7 @@ const getRequirementFileProp = () => { return 'purchaseRequirement'; }; -// 判断学校统一采购是否需要自动设置采购方式(5万<=金额<40万,服务类目,特殊服务类目) +// 判断学校统一采购是否需要自动设置采购方式(5万<=金额<30万,服务类目,特殊服务类目) const isAutoSelectPurchaseTypeUnion = computed(() => { if (isDeptPurchase.value) return false; if (!dataForm.budget) return false; @@ -1491,8 +1495,16 @@ watch( () => dataForm.purchaseChannel, () => isPurchaseCenter.value, ], - () => { - // 部门自行采购 & 采购途径为”委托采购中心采购”且为新增申请阶段:采购方式隐藏且不设置 + (newValues, oldValues) => { + const oldIsDeptPurchase = oldValues?.[2]; + const newIsDeptPurchase = newValues?.[2]; + + // 从部门自行采购切换到学校统一采购时:清空采购方式(由系统自动设置或采购中心审批时选择) + if (oldIsDeptPurchase === true && newIsDeptPurchase === false) { + dataForm.purchaseType = ''; + } + + // 部门自行采购 & 采购途径为"委托采购中心采购"且为新增申请阶段:采购方式隐藏且不设置 // 注意:查看模式和编辑模式不清空已有的采购方式 if (isDeptPurchase.value && isEntrustCenterChannel.value && !isFlowEmbed.value && !isViewMode.value && !isEditMode.value) { dataForm.purchaseType = ''; @@ -2060,7 +2072,7 @@ const getPurchaseTypeDeptDict = async () => { .map((item: any) => ({ id: item.id, label: item.label || item.dictLabel || item.name, - value: item.value || item.dictValue || item.code, + value: String(item.value || item.dictValue || item.code), })) .filter((item: any) => item.value !== DEPT_PURCHASE_TYPE.ENTRUST_CENTER) : []; @@ -2120,7 +2132,8 @@ const getPurchaseTypeUnionDict = async () => { ? res.data.map((item: any) => ({ id: item.id, label: item.label || item.dictLabel || item.name, - value: item.value || item.dictValue || item.code, + // 确保 value 为字符串类型,避免 el-select 无法匹配 + value: String(item.value || item.dictValue || item.code), })) : []; } catch (err) { diff --git a/src/views/purchase/purchasingrequisition/form.vue b/src/views/purchase/purchasingrequisition/form.vue index c896d96..55d1f43 100644 --- a/src/views/purchase/purchasingrequisition/form.vue +++ b/src/views/purchase/purchasingrequisition/form.vue @@ -3,7 +3,6 @@ v-model="visible" :title="dialogTitle" width="90%" - :style="{ maxWidth: '1600px' }" :close-on-click-modal="false" destroy-on-close class="form-iframe-dialog"