From 67d8a9e08f70358c46eec2ba3c7739791db65944 Mon Sep 17 00:00:00 2001
From: sinake <sinake1@qq.com>
Date: 星期一, 02 十一月 2026 10:42:18 +0800
Subject: [PATCH] 器管回款修改

---
 src/views/project/unitCost/organfee/index.vue |  519 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 475 insertions(+), 44 deletions(-)

diff --git a/src/views/project/unitCost/organfee/index.vue b/src/views/project/unitCost/organfee/index.vue
index 09566e2..6989a7b 100644
--- a/src/views/project/unitCost/organfee/index.vue
+++ b/src/views/project/unitCost/organfee/index.vue
@@ -8,10 +8,10 @@
       v-show="showSearch"
       label-width="90px"
     >
-      <el-form-item label="鎺ユ敹鍖婚櫌" prop="hospitalno">
+      <el-form-item label="浠樻鍖婚櫌" prop="hospitalno">
         <el-select
           v-model="queryParams.hospitalno"
-          placeholder="璇烽�夋嫨鎺ユ敹鍖婚櫌"
+          placeholder="璇烽�夋嫨浠樻鍖婚櫌"
           clearable
           filterable
           size="small"
@@ -34,7 +34,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="鎶ュ憡鏃ユ湡">
+      <el-form-item label="鎹愮尞鏃ユ湡">
         <el-date-picker
           v-model="donatetimeRange"
           type="daterange"
@@ -62,17 +62,44 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          >鏂板</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          >瀵煎嚭</el-button
+        >
+      </el-col>
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
       ></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" border :data="organfeeList">
+    <el-table
+      v-loading="loading"
+      border
+      :data="organfeeList"
+      highlight-current-row
+      @current-change="handleCurrentChange"
+    >
       <el-table-column type="index" label="搴忓彿" width="55" align="center" />
       <el-table-column
         prop="donatetime"
-        label="鎶ュ憡鏃ユ湡"
+        label="鎹愮尞鏃ユ湡"
         width="120"
         align="center"
       >
@@ -80,6 +107,7 @@
           <span>{{ parseTime(scope.row.donatetime, "{y}-{m}-{d}") }}</span>
         </template>
       </el-table-column>
+      
       <el-table-column
         prop="donorname"
         label="鎹愮尞鑰�"
@@ -93,34 +121,59 @@
         align="center"
       />
       <el-table-column
+        prop="payOrganName"
+        label="浠樻鍣ㄥ畼鍚嶇О"
+        width="140"
+        align="center"
+        show-overflow-tooltip
+      />
+      <el-table-column
         prop="caseno"
         label="鍣ㄥ畼鍒嗛厤缂栧彿"
         align="center"
         show-overflow-tooltip
       />
-      <el-table-column prop="name" label="鍙椾綋濮撴皬" width="120" align="center" />
-      <el-table-column label="绉绘鏃ユ湡" width="120" align="center">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.receiveTime, "{y}-{m}-{d}") }}</span>
-        </template>
-      </el-table-column>
+      <el-table-column prop="name" label="鍙椾綋" width="120" align="center" />
+      
       <el-table-column label="鍣ㄥ畼鐘舵��" width="120" align="center">
         <template slot-scope="scope">
           <span>{{ selectOrganState(scope.row.organState) }}</span>
         </template>
       </el-table-column>
+       <el-table-column
+        prop="hospitalname"
+        label="浠樻鍖婚櫌"
+        width="200"
+        align="center"
+      />
       <el-table-column
         prop="organcharge"
         label="搴旀敹閲戦"
         width="120"
         align="center"
       />
+      <el-table-column label="浠樻鐘舵��" width="100" align="center">
+        <template slot-scope="scope">
+          <span>{{ payStatus(scope.row) }}</span>
+        </template>
+      </el-table-column>
       <el-table-column
         prop="amount"
         label="瀹炴敹閲戦"
         width="120"
         align="center"
       />
+      <el-table-column label="鏈粯閲戦" width="160" align="center">
+        <template slot-scope="scope">
+          <span>{{ formatReceivableDiff(scope.row) }}</span>
+        </template>
+      </el-table-column>
+      
+      <el-table-column label="鏀舵鏃ユ湡" width="120" align="center">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.organtime, "{y}-{m}-{d}") }}</span>
+        </template>
+      </el-table-column>
       <el-table-column
         prop="organchargedesc"
         label="澶囨敞"
@@ -165,39 +218,243 @@
     <el-dialog
       title="淇敼鍣ㄥ畼淇℃伅"
       :visible.sync="editOpen"
-      width="500px"
+      width="760px"
       append-to-body
       :close-on-click-modal="false"
     >
-      <el-form ref="editForm" :model="editForm" label-width="90px">
-        <el-form-item label="鍣ㄥ畼鐘舵��" prop="organState">
-          <el-select
-            v-model="editForm.organState"
-            placeholder="璇烽�夋嫨鍣ㄥ畼鐘舵��"
-            style="width: 100%"
-          >
-            <el-option
-              v-for="item in organStateList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="澶囨敞" prop="organchargedesc">
-          <el-input
-            v-model="editForm.organchargedesc"
-            type="textarea"
-            :rows="3"
-            maxlength="200"
-            show-word-limit
-            placeholder="璇疯緭鍏ュ娉�"
-          />
-        </el-form-item>
+      <el-form ref="editForm" :model="editForm" label-width="110px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浠樻鍖婚櫌" prop="hospitalno">
+              <el-select
+                v-model="editForm.hospitalno"
+                placeholder="璇烽�夋嫨浠樻鍖婚櫌"
+                clearable
+                filterable
+                style="width: 100%"
+                @change="handleEditHospitalChange"
+              >
+                <el-option
+                  v-for="item in organizationList"
+                  :key="item.organizationid"
+                  :label="item.organizationname"
+                  :value="String(item.organizationid)"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浠樻鍣ㄥ畼鍚嶇О" prop="payOrganName">
+              <el-input
+                v-model="editForm.payOrganName"
+                maxlength="100"
+                placeholder="璇疯緭鍏ヤ粯娆惧櫒瀹樺悕绉�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍣ㄥ畼鍒嗛厤缂栧彿" prop="caseno">
+              <el-input
+                v-model="editForm.caseno"
+                maxlength="50"
+                placeholder="璇疯緭鍏ュ櫒瀹樺垎閰嶇紪鍙�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍙椾綋" prop="name">
+              <el-input
+                v-model="editForm.name"
+                maxlength="50"
+                placeholder="璇疯緭鍏ュ彈浣�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍣ㄥ畼鐘舵��" prop="organState">
+              <el-select
+                v-model="editForm.organState"
+                placeholder="璇烽�夋嫨鍣ㄥ畼鐘舵��"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in organStateList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞" prop="organchargedesc">
+              <el-input
+                v-model="editForm.organchargedesc"
+                type="textarea"
+                :rows="3"
+                maxlength="200"
+                show-word-limit
+                placeholder="璇疯緭鍏ュ娉�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="editOpen = false">鍙� 娑�</el-button>
         <el-button type="primary" :loading="editLoading" @click="submitEdit"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 鏂板鍣ㄥ畼璐圭敤 -->
+    <el-dialog
+      title="鏂板鍣ㄥ畼璐圭敤"
+      :visible.sync="addOpen"
+      width="820px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <el-form
+        ref="addForm"
+        :model="addForm"
+        :rules="addRules"
+        label-width="110px"
+      >
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎹愮尞鑰�" prop="donorname">
+              <el-input
+                v-model="addForm.donorname"
+                maxlength="50"
+                placeholder="璇疯緭鍏ユ崘鐚��"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浠樻鍖婚櫌" prop="hospitalno">
+              <el-select
+                v-model="addForm.hospitalno"
+                placeholder="璇烽�夋嫨浠樻鍖婚櫌"
+                clearable
+                filterable
+                style="width: 100%"
+                @change="handleAddHospitalChange"
+              >
+                <el-option
+                  v-for="item in organizationList"
+                  :key="item.organizationid"
+                  :label="item.organizationname"
+                  :value="String(item.organizationid)"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍣ㄥ畼鍚嶇О" prop="organname">
+              <el-input
+                v-model="addForm.organname"
+                maxlength="50"
+                placeholder="璇疯緭鍏ュ櫒瀹樺悕绉�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浠樻鍣ㄥ畼鍚嶇О" prop="payOrganName">
+              <el-input
+                v-model="addForm.payOrganName"
+                maxlength="100"
+                placeholder="璇疯緭鍏ヤ粯娆惧櫒瀹樺悕绉�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍣ㄥ畼鍒嗛厤缂栧彿" prop="caseno">
+              <el-input
+                v-model="addForm.caseno"
+                maxlength="50"
+                placeholder="璇疯緭鍏ュ櫒瀹樺垎閰嶇紪鍙�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍙椾綋" prop="name">
+              <el-input
+                v-model="addForm.name"
+                maxlength="50"
+                placeholder="璇疯緭鍏ュ彈浣�"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍣ㄥ畼鐘舵��" prop="organState">
+              <el-select
+                v-model="addForm.organState"
+                placeholder="璇烽�夋嫨鍣ㄥ畼鐘舵��"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in organStateList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏀舵鏃ユ湡" prop="organtime">
+              <el-date-picker
+                v-model="addForm.organtime"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="璇烽�夋嫨鏀舵鏃ユ湡"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="搴旀敹閲戦" prop="organcharge">
+              <el-input-number
+                v-model="addForm.organcharge"
+                :min="0"
+                :precision="2"
+                :controls="false"
+                placeholder="璇疯緭鍏ュ簲鏀堕噾棰�"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹炴敹閲戦" prop="amount">
+              <el-input-number
+                v-model="addForm.amount"
+                :min="0"
+                :precision="2"
+                :controls="false"
+                placeholder="璇疯緭鍏ュ疄鏀堕噾棰�"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞" prop="organchargedesc">
+              <el-input
+                v-model="addForm.organchargedesc"
+                type="textarea"
+                :rows="3"
+                maxlength="200"
+                show-word-limit
+                placeholder="璇疯緭鍏ュ娉�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addOpen = false">鍙� 娑�</el-button>
+        <el-button type="primary" :loading="addLoading" @click="submitAdd"
           >纭� 瀹�</el-button
         >
       </span>
@@ -208,9 +465,30 @@
 <script>
 import {
   listDonorchargeorgan,
-  updateDonorchargeorgan
+  addDonorchargeorgan,
+  updateDonorchargeorgan,
+  exportOrganfee
 } from "@/api/project/donorcharge";
 import { listOrganization } from "@/api/project/organization";
+
+/** 鏂板鍣ㄥ畼璐圭敤鐨勭┖琛ㄥ崟 */
+function emptyAddForm() {
+  return {
+    infoid: null,
+    donorname: null,
+    hospitalno: null,
+    hospitalname: null,
+    organname: null,
+    payOrganName: null,
+    caseno: null,
+    name: null,
+    organState: null,
+    organcharge: null,
+    amount: null,
+    organtime: null,
+    organchargedesc: null
+  };
+}
 
 export default {
   name: "Organfee",
@@ -218,12 +496,16 @@
     return {
       // 閬僵灞�
       loading: false,
+      // 瀵煎嚭閬僵灞�
+      exportLoading: false,
       // 鏄剧ず鎼滅储鏉′欢
       showSearch: true,
       // 鎬绘潯鏁�
       total: 0,
       // 鍣ㄥ畼璐圭敤鍒楄〃
       organfeeList: [],
+      // 琛ㄦ牸褰撳墠閫変腑琛�
+      currentRow: null,
       // 鎺ユ敹鍖婚櫌锛堟満鏋勶級涓嬫媺鏁版嵁
       organizationList: [],
       // 鎶ュ憡鏃ユ湡鍖洪棿
@@ -231,20 +513,40 @@
       // 鍣ㄥ畼鐘舵�侊紙瀵瑰簲 service_donorchargeorgan.organ_state锛�
       organStateList: [
         { value: "1", label: "绉绘" },
-        { value: "2", label: "澶卞姛" },
+        { value: "2", label: "寮冪敤" },
         { value: "3", label: "搴撳瓨" },
-        { value: "4", label: "宸茬Щ妞�" },
-        { value: "5", label: "寮冪敤" },
-        { value: "6", label: "鐩寸郴鍏嶉櫎" },
-        { value: "7", label: "涓嶈壇浜嬩欢" }
+        { value: "4", label: "澶卞姛" },
+        { value: "5", label: "鐩寸郴鍏嶉櫎" },
+        { value: "6", label: "涓嶈壇浜嬩欢" },
+        { value: "7", label: "绉戠爺" }
       ],
       // 淇敼寮圭獥
       editOpen: false,
       editLoading: false,
       editForm: {
         id: null,
+        hospitalno: null,
+        hospitalname: null,
+        payOrganName: null,
+        caseno: null,
+        name: null,
         organState: null,
         organchargedesc: null
+      },
+      // 鏂板寮圭獥
+      addOpen: false,
+      addLoading: false,
+      addForm: emptyAddForm(),
+      addRules: {
+        donorname: [
+          { required: true, message: "璇疯緭鍏ユ崘鐚��", trigger: "blur" }
+        ],
+        organname: [
+          { required: true, message: "璇疯緭鍏ュ櫒瀹樺悕绉�", trigger: "blur" }
+        ],
+        organcharge: [
+          { required: true, message: "璇疯緭鍏ュ簲鏀堕噾棰�", trigger: "blur" }
+        ]
       },
       // 鏌ヨ鍙傛暟
       queryParams: {
@@ -278,6 +580,53 @@
           this.loading = false;
         });
     },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$modal
+        .confirm("鏄惁纭瀵煎嚭鍣ㄥ畼璐圭敤鏁版嵁锛�")
+        .then(() => {
+          this.exportLoading = true;
+          return exportOrganfee(queryParams);
+        })
+        .then(response => {
+          this.$download.name(response.msg);
+        })
+        .catch(() => {})
+        .finally(() => {
+          this.exportLoading = false;
+        });
+    },
+    /** 搴旀敹閲戦-瀹炴敹閲戦鐨勫樊棰濓紙淇濈暀涓や綅灏忔暟锛夛紝搴旀敹閲戦涓虹┖鏃惰繑鍥� null */
+    receivableDiff(row) {
+      if (
+        row.organcharge === null ||
+        row.organcharge === undefined ||
+        row.organcharge === ""
+      ) {
+        return null;
+      }
+      const receivable = Number(row.organcharge);
+      if (isNaN(receivable)) {
+        return null;
+      }
+      const received = Number(row.amount);
+      const diff = receivable - (isNaN(received) ? 0 : received);
+      return Math.round(diff * 100) / 100;
+    },
+    /** 宸灞曠ず鏂囨湰锛屽浐瀹氫袱浣嶅皬鏁� */
+    formatReceivableDiff(row) {
+      const diff = this.receivableDiff(row);
+      return diff === null ? "" : diff.toFixed(2);
+    },
+    /** 宸涓� 0 涓哄凡浠橈紝鍏跺畠涓烘湭浠� */
+    payStatus(row) {
+      const diff = this.receivableDiff(row);
+      if (diff === null) {
+        return "";
+      }
+      return diff === 0 ? "宸蹭粯" : "鏈粯";
+    },
     /** 鏄惁鏈敹璐癸細organ_charge_state 涓� 0 鎴栦负绌� */
     isUncharged(row) {
       const state = row.organChargeState;
@@ -301,10 +650,92 @@
         })
         .catch(() => {});
     },
-    /** 鎵撳紑淇敼寮圭獥锛堝櫒瀹樼姸鎬併�佸娉級 */
+    /** 琛ㄦ牸褰撳墠琛屽彉鍖� */
+    handleCurrentChange(row) {
+      this.currentRow = row;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔锛氫互褰撳墠閫変腑鐨勪竴琛屼负妯℃澘锛屽鍒堕櫎 id 澶栫殑瀛楁 */
+    handleAdd() {
+      const row = this.currentRow;
+      if (!row) {
+        this.$modal.msgWarning("璇峰厛閫変腑涓�琛屾暟鎹�");
+        return;
+      }
+      this.addForm = {
+        infoid:
+          row.infoid === null || row.infoid === undefined ? null : row.infoid,
+        donorname: row.donorname || null,
+        hospitalno:
+          row.hospitalno === null || row.hospitalno === undefined
+            ? null
+            : String(row.hospitalno),
+        hospitalname: row.hospitalname || null,
+        organname: row.organname || null,
+        payOrganName: row.payOrganName || null,
+        caseno: row.caseno || null,
+        name: row.name || null,
+        organState:
+          row.organState === null || row.organState === undefined
+            ? null
+            : String(row.organState),
+        organcharge:
+          row.organcharge === null || row.organcharge === undefined
+            ? null
+            : row.organcharge,
+        amount:
+          row.amount === null || row.amount === undefined ? null : row.amount,
+        organtime: row.organtime || null,
+        organchargedesc: row.organchargedesc || null
+      };
+      this.addOpen = true;
+      this.$nextTick(() => {
+        this.$refs.addForm && this.$refs.addForm.clearValidate();
+      });
+    },
+    /** 浠樻鍖婚櫌閫夋嫨鍚庡悓姝ュ尰闄㈠悕绉� */
+    handleAddHospitalChange(value) {
+      const org = this.organizationList.find(
+        item => String(item.organizationid) === String(value)
+      );
+      this.addForm.hospitalname = org ? org.organizationname : null;
+    },
+    /** 淇敼寮圭獥锛氫粯娆惧尰闄㈤�夋嫨鍚庡悓姝ュ尰闄㈠悕绉� */
+    handleEditHospitalChange(value) {
+      const org = this.organizationList.find(
+        item => String(item.organizationid) === String(value)
+      );
+      this.editForm.hospitalname = org ? org.organizationname : null;
+    },
+    /** 鎻愪氦鏂板 */
+    submitAdd() {
+      this.$refs.addForm.validate(valid => {
+        if (!valid) {
+          return;
+        }
+        this.addLoading = true;
+        addDonorchargeorgan(this.addForm)
+          .then(() => {
+            this.$modal.msgSuccess("鏂板鎴愬姛");
+            this.addOpen = false;
+            this.getList();
+          })
+          .finally(() => {
+            this.addLoading = false;
+          });
+      });
+    },
+    /** 鎵撳紑淇敼寮圭獥锛堜粯娆惧尰闄€�佷粯娆惧櫒瀹樺悕绉般�佸櫒瀹樼姸鎬併�佸娉級 */
     handleEdit(row) {
       this.editForm = {
         id: row.id,
+        hospitalno:
+          row.hospitalno === null || row.hospitalno === undefined
+            ? null
+            : String(row.hospitalno),
+        hospitalname: row.hospitalname || null,
+        payOrganName: row.payOrganName || "",
+        caseno: row.caseno || "",
+        name: row.name || "",
         organState:
           row.organState === null || row.organState === undefined
             ? null

--
Gitblit v1.9.3