Browse Source

账户管理添加原路退回功能

shizi 2 months ago
parent
commit
a795083cc8

File diff suppressed because it is too large
+ 230 - 246
src/pages/Cashier/charges/PatientAccountManagement.jsx


+ 301 - 0
src/pages/Cashier/charges/component/InAccountTransfer.jsx

@@ -0,0 +1,301 @@
+/*
+ * Create:      柿子
+ * CreateDate:  2025/03/28
+ * Describe:   账内转账 - 账内用途转账
+ * */
+import React, { Component } from 'react';
+import { Modal, Select, Input, Row, Col, Form, message } from 'antd';
+import { Util } from 'tools';
+import './style/index.less';
+
+class InAccountTransfer extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      visible: false,
+      selectData: {},
+      rowData: {},
+      outPurPose: undefined, // 转出账户用途
+      inPurPose: undefined, // 转入账户用途
+      payamt: 0, // 转出金额(元)
+      transferOutPurposeAmt: 0.00, // 转出用途金额
+      transferInPurposeAmt: 0.00, // 转入用途金额
+      afterTransferAmt: 0.00, // 转入后金额
+      okLoading: false, // 确认loading
+    };
+
+    this.formItemInput = {
+      labelCol: { span: 6 },
+      wrapperCol: { span: 16 },
+    };
+  };
+
+  static getDerivedStateFromProps(nextProps, prevState) {
+    if (JSON.stringify(nextProps.selectData) !== JSON.stringify(prevState.selectData)) {
+      return {
+        selectData: nextProps.selectData,
+      }
+    }
+    return null
+  };
+
+  componentDidMount() {
+    this.props.onRef && this.props.onRef(this);
+  };
+
+  modifyVisible = (visible, rowData = {}) => {
+    if (visible) {
+      this.state.rowData = rowData;
+      let accPurposeCode = rowData?.accPurposeCode || undefined;
+      this.state.outPurPose = accPurposeCode; // 当前用途
+      this.state.transferOutPurposeAmt = rowData?.accPurposeAmt || 0.00; // 当前用途金额
+      this.props.form.setFieldsValue({ outPurPose: accPurposeCode });
+    };
+    this.setState({ visible }, () => {
+      !visible && this.handleReset();
+    });
+  };
+
+  // 确认
+  handleOk = () => {
+    try {
+      const { payamt, transferOutPurposeAmt } = this.state;
+      if (payamt && parseFloat(payamt) > parseFloat(transferOutPurposeAmt)) {
+        message.error('转出金额不能大于转出用途金额');
+        return;
+      }
+      if (payamt && parseFloat(payamt) < 0) {
+        message.error('转出金额不能小于0');
+        return;
+      }
+      this.props.form.validateFields(async (err, values) => {
+        if (!err) {
+          this.setState({ okLoading: true });
+          const { rowData } = this.state;
+          let data = {
+            params: [{
+              paymenttype: rowData?.paymenttype || 'P',
+              depositType: rowData?.depositType || 'O',
+              channel: rowData?.channel || 'OP', //缴款渠道 OP 门诊窗口充值、SM 自助机充值、IP住院预交金充值
+              accmanID: rowData?.accmanID || '',
+              admID: rowData?.admID || '',
+              patID: rowData?.patID || '',
+              ...values,
+            }]
+          }
+          let res = await React.$asyncPost(this, '05210097', data);
+          message.success(res?.errorMessage || '转账成功');
+          this.modifyVisible(false);
+          this.setState({ okLoading: false });
+          this.props.handleQuery && this.props.handleQuery();
+        } else {
+          message.error('请完善必填信息!');
+        }
+      });
+    } catch (error) {
+      this.setState({ okLoading: false });
+    }
+  };
+
+  handleTransferOutChange = async (e) => {
+    const { payamt, inPurPose } = this.state;
+    let purposeAmt = await this.getAccountPurposeAmount(e);
+    if (payamt && (parseFloat(purposeAmt) < parseFloat(payamt))) { // 如果实际用途金额小于填写的转出金额,将转出金额设置为实际用途金额
+      this.setTransferOutAmt(purposeAmt || undefined);
+    };
+    if (e === inPurPose) { // 如果选择的转出用途和选择的转入用途一致,则清空转入用途
+      this.state.inPurPose = undefined;
+      this.state.transferInPurposeAmt = 0.00;
+      this.state.afterTransferAmt = 0.00;
+      this.props.form.setFieldsValue({ inPurPose: undefined });
+    }
+    this.setState({ outPurPose: e, transferOutPurposeAmt: purposeAmt }, () => {
+      this.getAfterTransferAmt(); // 计算转入后的金额
+    });
+  };
+
+  // 获取账户用途金额
+  getAccountPurposeAmount = async (accPurposeCode) => {
+    let purposeAmount = 0;
+    try {
+      let { rowData } = this.state;
+      if (!accPurposeCode) {
+        return 0
+      };
+      let data = {
+        params: [{
+          accmanID: rowData?.accmanID || '',
+          puposeCode: accPurposeCode,
+          admID: rowData?.admID || ''
+        }]
+      }
+      let res = await React.$asyncPost(this, '03040039', data);
+      purposeAmount = res?.purposeBlance || 0;
+    } catch (error) {
+      console.log(error)
+    }
+    return purposeAmount;
+  };
+
+  // 设置转出金额
+  setTransferOutAmt = (val) => {
+    this.props.form.setFieldsValue({ payamt: val });
+    this.setState({ payamt: val });
+  };
+
+  // 全部转出
+  handleAllTransferOut = () => {
+    const { transferOutPurposeAmt } = this.state;
+    this.setTransferOutAmt(transferOutPurposeAmt);
+    this.setState({}, () => {
+      this.getAfterTransferAmt(); // 计算转入后的金额
+    })
+  };
+
+  handleTransferOutAmtChange = e => {
+    this.setState({ payamt: e.target.value }, () => {
+      this.getAfterTransferAmt(); // 计算转入后的金额
+    })
+  };
+
+  // 转入用途切换
+  handleTransferInChange = async (e) => {
+    let purposeAmt = await this.getAccountPurposeAmount(e);
+    this.setState({ inPurPose: e, transferInPurposeAmt: purposeAmt }, () => {
+      this.getAfterTransferAmt();
+    });
+  };
+
+  // 重置数据
+  handleReset = () => {
+    this.props.form.resetFields();
+    this.setState({
+      payamt: 0,
+      outPurPose: undefined, // 转出账户用途
+      inPurPose: undefined, // 转入账户用途
+      transferOutPurposeAmt: 0.00,
+      transferInPurposeAmt: 0.00,
+      afterTransferAmt: 0.00,
+    });
+  };
+
+  // 计算转入后的金额
+  getAfterTransferAmt = () => {
+    const { payamt, inPurPose, transferInPurposeAmt } = this.state;
+    if (payamt && inPurPose) {
+      this.setState({ afterTransferAmt: Util.retainDecimalPlaces(parseFloat(payamt) + parseFloat(transferInPurposeAmt), 2) });
+    } else {
+      this.setState({ afterTransferAmt: 0.00 });
+    }
+  };
+
+  render() {
+    const { width, title } = this.props;
+    const { getFieldDecorator } = this.props.form;
+    const { visible, selectData, transferOutPurposeAmt, transferInPurposeAmt, afterTransferAmt, outPurPose, payamt, okLoading } = this.state;
+
+    return (
+      <div>
+        <Modal
+          width={width || '520px'}
+          title={title || '账内用途转账'}
+          maskClosable={false}
+          visible={visible}
+          okButtonProps={{
+            loading: okLoading
+          }}
+          onOk={this.handleOk}
+          onCancel={() => this.modifyVisible(false)}
+        >
+          <div className="in-account-transfer-form">
+            <Form>
+              <div>
+                <Form.Item label="转出用途" {...this.formItemInput}>
+                  {getFieldDecorator('outPurPose', {
+                    initialValue: undefined,
+                    rules: [{ required: true, message: '转出用途不能为空!' }],
+                  })(
+                    <Select
+                      allowClear
+                      showSearch
+                      style={{ width: '100%' }}
+                      placeholder="请选择"
+                      optionFilterProp="search"
+                      onChange={this.handleTransferOutChange}
+                    >
+                      {React.$SelectOptions(selectData?.accPurpose || [], 'code')}
+                    </Select>
+                  )}
+                </Form.Item>
+              </div>
+              <Row style={{ marginBottom: '10px' }}>
+                <Col span={this.formItemInput?.labelCol?.span || 7}></Col>
+                <Col span={this.formItemInput?.wrapperCol?.span || 14} className="flex-between-center">
+                  <div>
+                    <span className="common-remark-label">可用余额:</span>
+                    <span className="common-number">¥ {transferOutPurposeAmt}</span>
+                  </div>
+                  <div>
+                    <span className="span" style={{ fontSize: '14px' }} onClick={this.handleAllTransferOut}>全部转出</span>
+                  </div>
+                </Col>
+              </Row>
+              <div style={{ marginBottom: '16px' }}>
+                <Form.Item
+                  label="转出金额(元)"
+                  {...this.formItemInput}
+                  validateStatus={payamt && (parseFloat(payamt) > parseFloat(transferOutPurposeAmt) || parseFloat(payamt) < 0) ? 'error' : undefined}
+                  help={payamt && parseFloat(payamt) > parseFloat(transferOutPurposeAmt) ? '转出金额不能大于可用余额!' : (payamt && parseFloat(payamt) < 0 ? '转出金额不能小于0!' : undefined)}
+                >
+                  {getFieldDecorator('payamt', {
+                    initialValue: undefined,
+                    rules: [{ required: true, message: '转出金额不能为空!' }],
+                  })(
+                    <Input
+                      placeholder="请输入"
+                      type="number"
+                      className="input-number"
+                      style={{ width: '100%' }}
+                      onChange={this.handleTransferOutAmtChange}
+                    />
+                  )}
+                </Form.Item>
+              </div>
+              <div>
+                <Form.Item label="转入用途" {...this.formItemInput}>
+                  {getFieldDecorator('inPurPose', {
+                    initialValue: undefined,
+                    rules: [{ required: true, message: '转入用途不能为空!' }],
+                  })(
+                    <Select
+                      allowClear
+                      showSearch
+                      style={{ width: '100%' }}
+                      placeholder="请选择"
+                      optionFilterProp="search"
+                      onChange={this.handleTransferInChange}
+                    >
+                      {React.$SelectOptions((selectData?.accPurpose || []).filter(item => (item?.code || item.id || '') !== outPurPose), 'code')}
+                    </Select>
+                  )}
+                </Form.Item>
+              </div>
+              <Row style={{ marginBottom: '24px' }}>
+                <Col span={this.formItemInput?.labelCol?.span || 7}></Col>
+                <Col span={this.formItemInput?.wrapperCol?.span || 14}>
+                  <span className="common-remark-label">当前余额:</span>
+                  <span className="span">¥ {transferInPurposeAmt}</span>
+                  <span style={{ marginLeft: '20px' }} className="common-remark-label">转入后余额:</span>
+                  <span className="span">¥ {afterTransferAmt}</span>
+                </Col>
+              </Row>
+            </Form>
+          </div>
+        </Modal>
+      </div>
+    );
+  }
+};
+
+const InAccountTransferForm = Form.create()(InAccountTransfer);
+export default InAccountTransferForm;

+ 6 - 0
src/pages/Cashier/charges/component/style/index.less

@@ -0,0 +1,6 @@
+// 账内用途转账
+.in-account-transfer-form {
+  .ant-row.ant-form-item {
+    margin-bottom: 4px;
+  }
+}

+ 4 - 4
src/pages/Cashier/charges/style/index.less

@@ -307,7 +307,7 @@
         line-height: 1.5;
         word-wrap: break-word;
         min-height: 75vh;
-        max-height: 75vh;
+        max-height: 85vh;
         overflow-y: auto;
     }
 
@@ -477,8 +477,8 @@ input.inputInvoiceInfomation {
     }
 }
 
-// shizi -- 门诊收费
-.patient-charges-shizi {
+// 门诊收费
+.patient-charges-new-insu {
     width: 100%;
     height: 100%;
     padding: 0 54px;
@@ -527,7 +527,7 @@ input.inputInvoiceInfomation {
         width: 14px;
         height: 14px;
         position: absolute;
-        top: 21px;
+        top: 25px;
         left: 0px;
     }
 

Some files were not shown because too many files changed in this diff