更改支付状态逻辑.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. 原 PHP 项目"更改支付状态"功能逻辑分析
  2. 基于代码分析,这个功能的完整逻辑如下:
  3. 1. 业务流程
  4. GET 请求(显示弹框):
  5. - 根据检查ID查询检查信息:$this->model->get($ids)
  6. - 将检查信息传递给视图:$this->view->ins = $ins
  7. - 返回弹框页面,显示患者姓名和当前支付状态(单选框:未支付/已支付)
  8. POST 请求(提交修改):
  9. 1. 更新 exams 表的 pay_status 字段
  10. 2. 如果修改为"已支付"(pay_status=1),则创建资金流水记录
  11. 2. 核心逻辑代码(Exams.php:124-156)
  12. public function change_pay($ids)
  13. {
  14. // 1. 查询检查信息
  15. $ins = $this->model->get($ids);
  16. if($this->request->isPost()){
  17. $info = $this->request->post();
  18. // 2. 更新支付状态
  19. $res = $this->model->where('id', $ids)->update([
  20. 'pay_status' => $info['pay_status']
  21. ]);
  22. if(!$res){
  23. $this->error('更新失败','','',3);
  24. }
  25. // 3. 如果改为"已支付",生成资金流水
  26. if($info['pay_status'] == 1)
  27. {
  28. // 3.1 查询机构信息(获取胶片价格和收费模式)
  29. $institution = Db::table('institution')
  30. ->where('id',$ins['institution_id'])
  31. ->find();
  32. // 3.2 构建流水记录
  33. $money = [
  34. 'money' => $institution['film_price'], // 金额(分)
  35. 'order_type' => $institution['charge_mode'], // 订单类型
  36. 'type' => '2', // 类型:2=电子胶片
  37. 'exam_id' => $ins['id'], // 检查ID
  38. 'institution_id' => $ins['institution_id'], // 机构ID
  39. 'pay_way' => '2', // 支付方式:2=医院支付
  40. 'status' => 0, // 状态:0=未支付
  41. 'order_status' => 1, // 订单状态:1=未处理
  42. 'pay_type' => '1' // 1=支入
  43. ];
  44. // 3.3 插入流水表
  45. Db::table('money_water')->insert($money);
  46. }
  47. $this->success('修改成功','','',1);
  48. return true;
  49. }
  50. // GET请求:显示弹框
  51. $this->view->ins = $ins;
  52. return $this->view->fetch('change_pay');
  53. }
  54. 3. 数据表结构
  55. exams 表:
  56. - pay_status:支付状态(0=未支付,1=已支付)
  57. institution 表:
  58. - film_price:电子胶片价格(单位:分)
  59. - charge_mode:收费模式
  60. - 1:向患者结算(患者支付)
  61. - 2:向医院结算(医院托管)
  62. - 3:医院代收
  63. money_water 表(资金流水表):
  64. - money:金额(单位:分)
  65. - order_type:订单类型(与机构的 charge_mode 对应)
  66. - type:类型(1=远程申请,2=电子胶片)
  67. - exam_id:关联的检查ID
  68. - institution_id:关联的机构ID
  69. - pay_way:支付方式(1=患者支付,2=医院支付)
  70. - status:支付状态(0=未支付,2=已支付)
  71. - order_status:订单状态(1=未处理,2=进行中,3=已完成)
  72. - pay_type:1=支入,2=退款
  73. 4. 关键点
  74. 1. 只有改为"已支付"才生成流水:改为"未支付"不会生成流水记录
  75. 2. 流水记录的状态矛盾:
  76. - exams.pay_status 改为 1(已支付)
  77. - 但 money_water.status 插入的是 0(未支付)
  78. - 可能原因:这里的 money_water.status 代表"资金流水的处理状态",而不是"患者是否支付"
  79. 3. 金额来源:从机构配置的 film_price 字段获取
  80. 4. 订单类型:从机构配置的 charge_mode 字段获取(决定向谁收费)
  81. 5. 固定值:
  82. - type=2:电子胶片
  83. - pay_way=2:医院支付
  84. - pay_type=1:支入
  85. - order_status=1:订单未处理
  86. 5. 前端展示(change_pay.html)
  87. <!-- 显示患者姓名(真实姓名,不脱敏) -->
  88. <h3>{$ins.name}</h3>
  89. <!-- 支付状态单选框 -->
  90. <div class="form-group">
  91. <label>支付状态:</label>
  92. <div>
  93. <!-- 0=未支付, 1=已支付 -->
  94. {:build_radios('pay_status', ['0'=>'未支付', '1'=>'已支付'], $ins['pay_status'])}
  95. </div>
  96. </div>
  97. 这就是原 PHP 项目中"更改支付状态"的完整实现逻辑。主要用于手动调整检查的支付状态,并在标记为"已支付"时自动生成对应的资金流水记录。