chenjun преди 1 седмица
родител
ревизия
ec8ecf9c51

+ 13 - 0
.workbuddy/memory/2026-08-06.md

@@ -268,3 +268,16 @@
 - 红名单下拉选项本身来自 `NINE_RISKS`,已固定为「防误食」,映射后筛选可正常命中。
 
 类型检查:NO_NINE_SAFETY_ERRORS。
+
+## ContractBodyHubei.vue — 按《湖北省养老机构服务合同(2024版)》.docx 重写正文
+
+用户要求:以桌面上的湖北 2024 标准合同 docx 为准,改造 `src/views/elderly/contracts/components/ContractBodyHubei.vue`,保留原组件设计模式(a4-page / section-title / content-text / FieldItem / SignatureItem)与功能,仅替换正文内容。
+
+关键点(用户特别强调):
+- 费用章节**保持动态生成**,不要写死:monthlyExpenses / oneTimeExpenses / stageExpenses 三块列表渲染原样保留(template 第 1418/1471/1562 行附近)。
+- 争议解决条款误用 accountName/bank 字段,已改为独立字段 disputeCourt / disputeArbitration。
+
+新增字段(contractForm):partyAEmail、partyAContactPhone、elderCensusAddr、elderPhone、elderEmail、roomFloor、bedNo、trialDays(默认7)、trialStart/End、renewDays、emergencyContact*、memberFeeAmt/Cn/RefundMode、penaltyPercent、disputeMode/Court/Arbitration、copyCount。
+- fillContractForm / parse 回填均补了映射,memberFeeAmt 加中文大写 watch(同 deposit)。
+- 正文覆盖:使用说明、甲乙丙方信息、第一条~第十四条(服务内容与方式、费用、期限与变更、护理等级、甲方/乙方权利义务、丙方责任、信息保护、保密、违约责任、免责、争议解决、合同生效附件)。
+- 验证:ESLint 0 错误;vue-tsc 过滤 ContractBodyHubei 无报错。

+ 29 - 0
.workbuddy/memory/2026-08-10.md

@@ -0,0 +1,29 @@
+# 2026-08-10
+
+## ProcessForm.vue — 出生日期回显为空(负数时间戳)
+
+问题:`TgDatePicker`(`src/components/ToggleForm/src/TgDatePicker.vue`)设置了 `value-format="YYYY-MM-DD"`,要求 `modelValue` 为对应格式的字符串。后端返回的 `birthday` 是毫秒时间戳(如 `-1086249600000`,小于 1970 年为负数),`ProcessForm.vue` 里 `init()` / `open()` 直接用 `Object.assign(dataForm, res)` 把负数时间戳塞进 `dataForm.birthday`,导致日期选择器无法解析、回显为空。
+
+修复:在 `init()` 和 `open()` 中 `Object.assign` 后加一行格式化:
+```js
+dataForm.birthday = res.birthday ? formatTime(res.birthday, 'yyyy-MM-dd') : ''
+```
+与 `getInfo()` 身份证解析返回的 `'yyyy-MM-dd'` 字符串格式保持一致,也符合 `TgDatePicker` 的 `value-format`。
+
+验证:ESLint 0 错误;vue-tsc 过滤 ProcessForm 无报错。
+
+## ContractBody.vue / ContractBodyHubei.vue — 丙方信息残留上一份合同数据
+
+问题:用户反馈丙方「证件号码」上一个人有数据、下一个人没有时不会清除。检查 `fillContractForm` 发现以下字段都是「条件赋值」或「从未赋值」,上一份合同的数据会残留:
+- `partyCGenderText`、`partyCIdCard`、`partyCPapersType`、`partyCBirth`(仅在对应字段存在时才赋值)
+- `partyCZip`、`partyCCommAddr`、`partyCAccountName`、`partyCBank`、`partyCAccount`(从未从家属数据回填)
+- `partyCSign`、`partyCDate`(仅外部签名数据传入时才赋值)
+- 同类风险还包括乙方条件字段 `elderGenderText`/`elderIdCard`/`elderPapersType`/`elderBirth`、日期 `startDate`/`endDate`、费用 `totalFee`/`deposit*`、房间 `roomType`/`roomNo`。
+
+修复:在两个组件的 `fillContractForm` 开头统一清空可能残留的字段,再按原有逻辑重新回填。这样新合同缺少对应数据时,字段会回到空值而非保留旧值。
+
+涉及文件:
+- `src/views/elderly/contracts/components/ContractBody.vue`
+- `src/views/elderly/contracts/components/ContractBodyHubei.vue`
+
+验证:ESLint 0 错误;vue-tsc 过滤 ContractBody 无报错。

+ 2 - 0
src/views/elderly/apply/check-in-request/ProcessForm.vue

@@ -1406,6 +1406,7 @@ const init = async (id, detail, type) => {
       dataForm.custodianFiles = []
       dataForm.idCard2 = res.papersType != 1 ? res.idCard : ''
       dataForm.idCard = res.papersType == 1 ? res.idCard : ''
+      dataForm.birthday = res.birthday ? formatTime(res.birthday, 'yyyy-MM-dd') : ''
     }
   }
 }
@@ -1442,6 +1443,7 @@ const open = async (res, detail, type, tId) => {
     dataForm.otherFiles = [..._elderFiles, ..._custodianFiles, ..._otherFiles]
     dataForm.elderFiles = []
     dataForm.custodianFiles = []
+    dataForm.birthday = res.birthday ? formatTime(res.birthday, 'yyyy-MM-dd') : ''
     dataForm.birthdayCareDate = res.birthdayCareDate ? new Date(res.birthdayCareDate) : ''
     dataForm.tenantId = tId
     dataForm.elderCover = res.elderCover ? res.elderCover : []

+ 42 - 5
src/views/elderly/contracts/components/ContractBody.vue

@@ -302,6 +302,42 @@ const fillContractForm = (data: any) => {
   detailData.value = data
   const contract = data.elderlyContractDO || {}
 
+  // 先清空可能从上份合同残留的数据,再重新回填
+  contractForm.elderGenderText = ''
+  contractForm.elderIdCard = ''
+  contractForm.elderPapersType = ''
+  contractForm.elderBirth = ''
+  contractForm.startDate = ''
+  contractForm.endDate = ''
+  contractForm.roomType = ''
+  contractForm.roomNo = ''
+  contractForm.totalFee = ''
+  contractForm.depositFee = ''
+  contractForm.depositAmt = ''
+  contractForm.depositAmtCn = ''
+  contractForm.depositAmt1 = ''
+  contractForm.depositAmtCn1 = ''
+  contractForm.depositAmt2 = ''
+  contractForm.depositAmtCn2 = ''
+  contractForm.depositType = ''
+  contractForm.partyCName = ''
+  contractForm.partyCGenderText = ''
+  contractForm.partyCBirth = ''
+  contractForm.partyCPapersType = ''
+  contractForm.partyCRelation = ''
+  contractForm.partyCIdCard = ''
+  contractForm.partyCPhone = ''
+  contractForm.partyCAddress = ''
+  contractForm.partyCHomeAddr = ''
+  contractForm.partyCZip = ''
+  contractForm.partyCWorkUnit = ''
+  contractForm.partyCCommAddr = ''
+  contractForm.partyCAccountName = ''
+  contractForm.partyCBank = ''
+  contractForm.partyCAccount = ''
+  contractForm.partyCSign = ''
+  contractForm.partyCDate = ''
+
   contractForm.contractNumber = contract.contractNumber || ''
   contractForm.elderName = contract.elderName || data.elderName || ''
 
@@ -710,9 +746,9 @@ const displayExpenseName = (item: any): string => {
   const category = item?.itemCategoryName || ''
   const name = item?.itemName || ''
   if (category && name && category !== name) {
-    return `${category}(${name})`
+    return `${category}(${name})`
   }
-  return category || name || ''
+  return category + '¥' || name + '¥' || ''
 }
 
 const bedList = ref<{ chargeName: string; id: string; price: number }[]>([])
@@ -1332,7 +1368,7 @@ watch(
           3.根据本合同第一条、第二条乙方选择的房间、照护等级及服务项目,各方共同确认,乙方入住甲方需支付的养老服务费用具体如下:
         </p>
         <p class="content-text">
-          &nbsp;&nbsp;&nbsp;&nbsp;(1)养老服务费用为
+          &nbsp;&nbsp;&nbsp;&nbsp;(1)养老服务费用为:¥
           <FieldItem
             v-model="contractForm.totalFee"
             :is-text-mode="isTextMode"
@@ -1343,7 +1379,7 @@ watch(
         </p>
         <p class="content-text"> &nbsp;&nbsp;&nbsp;&nbsp;其中: </p>
         <p v-for="item in monthlyExpensesList" :key="item.id" class="content-text">
-          {{ item.itemCategoryName || item.itemName }}:
+          {{ item.itemCategoryName+'¥' || item.itemName+'¥' }}:
           <FieldItem
             v-model="item.actualAmount"
             :is-text-mode="isTextMode"
@@ -1445,8 +1481,9 @@ watch(
         </p>
         <p class="content-text"> 4.乙方应支付的阶段性费用及支付方式如下: </p>
         <div v-for="item in stageExpensesList" :key="item.id" class="content-text">
-          &nbsp;&nbsp;&nbsp;&nbsp;{{ displayExpenseName(item) }}
+          &nbsp;&nbsp;&nbsp;&nbsp;{{ displayExpenseName(item) }}:
           <template v-if="item.isFreeGift == 1">
+            ({{ item.amount }})
             赠送开始时间
             <FieldItem
               v-model="item.freeStartTime"

Файловите разлики са ограничени, защото са твърде много
+ 581 - 588
src/views/elderly/contracts/components/ContractBodyHubei.vue


Някои файлове не бяха показани, защото твърде много файлове са промени