25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

340 lines
10 KiB

  1. <template>
  2. <view class="lr-form-container">
  3. <l-input v-model="StuInfoFreshData.StuNo" disabled title="学号" placeholder="请填写学号" right/>
  4. <l-input v-model="StuInfoFreshData.StuName" disabled title="姓名" placeholder="请填写学号" right />
  5. <l-input :value="displayListItem(StuInfoFreshData, 'ClassNo')" disabled title="班级" placeholder="请填写班级" right />
  6. <!-- <l-input :value="displayListItem(StuInfoFreshData, 'DeptNo')" disabled title="系别" placeholder="请填写系别" right /> -->
  7. <l-input :value="displayListItem(StuInfoFreshData, 'MajorNo')" disabled title="专业" right />
  8. <l-input :value="StuInfoFreshData.FSYear" disabled title="缴费年度" placeholder="请填写系别" right />
  9. <!-- 姓名 StuName 班级 className 系别 deptName FinaChargesStandardList [缴费项目 ChargeItemName 收费标准 Standard 本次实缴 SJAmount] -->
  10. <l-customform-table
  11. @input="($event)=>{FinaChargesStandardList = $event}"
  12. :value="FinaChargesStandardList"
  13. :item="item"
  14. :edit="false"
  15. />
  16. <view style="margin-top: 8px;">
  17. <l-input v-model="PayFeeTotal" disabled title="应缴合计" disabled right />
  18. <l-input v-model="payfeetotal" disabled title="实缴合计" disabled right />
  19. <l-input v-model="SJAmount" disabled title="已缴金额" disabled right />
  20. </view>
  21. <view style="display:flex;justify-content: center;padding-top: 18px;">
  22. <image v-if="qrCodeUrl" :src="qrCodeUrl" mode="widthFix"></image>
  23. </view>
  24. <!-- :edit="isEdit(item)" -->
  25. <!-- @input="setValue(item.__valuePath__, $event)" -->
  26. <!-- <view>
  27. <l-select v-model="queryData.PayFeeStatus" :range="dataSource.PayStatus" title="线上缴费状态" placeholder="请选择" />
  28. </view>
  29. <view>
  30. <l-input v-model="queryData.StudentLoan" :disabled="disabled" title="贷款回执码" placeholder="请填写贷款回执码" right />
  31. </view>
  32. <view>
  33. <l-select v-model="queryData.OnsitePayFeeStatus" :range="dataSource.OnsitePayStatus" title="现场缴费状态" placeholder="请选择" />
  34. </view> -->
  35. <view v-if="ready&&canPay&&!qrCodeUrl" class="btn" @click="tapBtn('getQRCode')">
  36. 生成二维码
  37. </view>
  38. <view v-if="ready&&canPay" class="btn" @click="tapBtn('getPayRes')">
  39. 查询缴费结果
  40. </view>
  41. <view class="btn" v-if="ready" @click="lookInvioce">
  42. 查看发票
  43. </view>
  44. <view class="btn" @click="NAV_BACK()">
  45. 取消缴费
  46. </view>
  47. <view style="height: 18px;">
  48. </view>
  49. </view>
  50. </template>
  51. <script>
  52. import moment from 'moment';
  53. import get from 'lodash/get';
  54. import set from 'lodash/set';
  55. import pickBy from 'lodash/pickBy';
  56. import mapValues from 'lodash/mapValues';
  57. import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
  58. export default{
  59. components:{
  60. tkiQrcode,
  61. },
  62. data() {
  63. return {
  64. disabled: false,
  65. ready:false,
  66. canPay:false,
  67. // 数据源
  68. dataSource: {
  69. ClassNo:[],
  70. DeptNo:[],
  71. MajorNo:[],
  72. // PayStatus: Object.values(this.GET_GLOBAL('dataDictionary').PayStatus).map(t => ({ value: t.value, text: t.text })),
  73. // OnsitePayStatus: Object.values(this.GET_GLOBAL('dataDictionary').OnsitePayStatus).map(t => ({ value: t.value, text: t.text }))
  74. },
  75. queryData: {
  76. StudentLoan: '',
  77. PayFeeStatus: '',
  78. OnsitePayFeeStatus: '',
  79. StudentLoanStatus: '0'
  80. },
  81. pageInfo:{},
  82. scheme: {
  83. ClassNo: {
  84. type: 'select',
  85. dataSource: '1',
  86. dataSourceId: 'bjsj,classname,classno'
  87. },
  88. DeptNo:{
  89. type: 'dataItem',
  90. dataType: 'dataDictionary'
  91. },
  92. MajorNo:{
  93. type: 'dataItem',
  94. dataType: 'dataDictionary'
  95. },
  96. },
  97. StuInfoFreshData:{},
  98. PayFeeTotal:'',
  99. payfeetotal:'',
  100. SJAmount:'',
  101. FinaChargesStandardList:[],
  102. item:{
  103. title:'缴费信息',
  104. fieldsData:[
  105. {type:'label',field:'ChargeItemName',name:'缴费项目'},
  106. {type:'label',field:'Standard',name:'收费标准'},
  107. {type:'input',field:'NeedToPay',name:'本次实缴(可修改)',edit:true},
  108. ]
  109. },
  110. qrCodeUrl:'',
  111. }
  112. },
  113. watch: {
  114. FinaChargesStandardList: {
  115. handler (val) {
  116. this.getpayfeetotal()
  117. },
  118. // 这里是关键,代表递归监听 demo 的变化
  119. deep: true
  120. }
  121. },
  122. methods:{
  123. async init() {
  124. this.pageInfo = this.GET_PARAM(); //获取页面传递参数
  125. this.LOADING('加载数据中…');
  126. await Promise.all([
  127. this.FETCH_DATASOURCE('bjsj').then(data => {
  128. this.dataSource.ClassNo = data.data.map(t => ({
  129. text: t.classname,
  130. value: t.classno
  131. }));
  132. }),
  133. this.FETCH_DATASOURCE('CdDeptInfo').then(data => {
  134. this.dataSource.DeptNo = data.data.map(t => ({
  135. text: t.deptname,
  136. value: t.deptno
  137. }));
  138. }),
  139. this.FETCH_DATASOURCE('CdMajorInfo').then(data => {
  140. this.dataSource.MajorNo = data.data.map(t => ({
  141. text: t.majorname,
  142. value: t.majorno
  143. }));
  144. }),
  145. () => {}
  146. ]);
  147. this.HTTP_GET('/ReceiveSendFeeManagement/FinaChargeStuYearApi/getpayfeeinfo?keyValue='+this.pageInfo.FSYId, null,'加载数据时出错').then(res => {
  148. this.HIDE_LOADING();
  149. if(!res){
  150. return
  151. }
  152. if (res['FinaChargesStandardList'].length == 0) {
  153. this.TOAST("未查询到该学生收费标准!请先维护收费明细。");
  154. return;
  155. }
  156. this.FinaChargesStandardList = res.FinaChargesStandardList.map((item)=>{
  157. item.copy_SJAmount = item.NeedToPay
  158. return item
  159. })
  160. this.StuInfoFreshData = res.StuInfoFreshData
  161. this.PayFeeTotal = res.PayFeeTotal
  162. this.getpayfeetotal()
  163. if(Number(this.payfeetotal)>0){
  164. this.canPay = true
  165. }else{
  166. this.changeIpnutEdit(false)
  167. this.TOAST("缴费已完成")
  168. }
  169. this.SJAmount = res.SJAmount
  170. this.ready = true
  171. })
  172. },
  173. // 显示列表中的标题项
  174. displayListItem(item, field) {
  175. const fieldItem = this.scheme[field];
  176. const value = item[field];
  177. switch (fieldItem.type) {
  178. case 'currentInfo':
  179. case 'organize':
  180. return fieldItem.dataType === 'time' ? value : get(this.GET_GLOBAL(fieldItem.dataType), `${value}.name`, '');
  181. case 'radio':
  182. case 'select':
  183. const selectItem = this.dataSource[field].find(t => t.value === String(value));
  184. return get(selectItem, 'text', '');
  185. case 'dataItem':
  186. const sex = this.dataSource[field].find(t => t.value === String(value));
  187. return get(sex, 'text', '');
  188. case 'checkbox':
  189. if (!value || value.split(',').length <= 0) {
  190. return '';
  191. }
  192. const checkboxItems = value.split(',');
  193. return this.dataSource[field]
  194. .filter(t => checkboxItems.includes(t.value))
  195. .map(t => t.text)
  196. .join(',');
  197. case 'datetime':
  198. if (!value) {
  199. return '';
  200. }
  201. return moment(value).format(Number(fieldItem.dateformat) === 0 ? 'YYYY年 M月 D日' : 'YYYY-MM-DD HH:mm');
  202. default:
  203. return value === null || value === undefined ? '' : value;
  204. }
  205. },
  206. tapBtn(action) {
  207. if(action == "getQRCode"){
  208. let list = [],isNull=false,tooMuch=false;
  209. this.FinaChargesStandardList.forEach(item=>{
  210. let value = 0
  211. if(/^-?\d+(,\d{3})*(\.\d{1,2})?$/.test(item.NeedToPay)&&Number(item.NeedToPay)>=0){
  212. value = Number(item.NeedToPay)
  213. }else{
  214. isNull=true
  215. }
  216. if(Number(item.NeedToPay)>Number(item.copy_SJAmount))
  217. {
  218. tooMuch=true;
  219. }
  220. let entity = {
  221. ChargeItemName: item.ChargeItemName.replace(/^\s*|\s*$/g, ""),
  222. ChargeItemCode: item.ChargeItemCode,
  223. YJAmount: item.Standard,
  224. SJAmount: value
  225. }
  226. list.push(entity)
  227. })
  228. if (tooMuch) {
  229. this.TOAST("[本次实缴]金额不能超过待缴金额!");
  230. return;
  231. }
  232. if (isNull) {
  233. this.TOAST("[本次实缴]金额为空或错误!最多两位小数。");
  234. return;
  235. }
  236. if(Number(this.payfeetotal) == 0){
  237. this.TOAST("[实缴合计]不能为0!缴费失败。");
  238. return;
  239. }
  240. var param = {};
  241. param.FSYId=this.pageInfo.FSYId;
  242. param.StuNo=this.StuInfoFreshData.StuNo;
  243. param.FSYear=this.StuInfoFreshData.FSYear;
  244. param.PayMoney = this.payfeetotal;
  245. let postData = { strEntity: JSON.stringify(param), detailList: JSON.stringify(list) }
  246. this.changeIpnutEdit(false)
  247. this.LOADING('正在生成付款信息请稍等…');
  248. this.HTTP_POST('/ReceiveSendFeeManagement/FinaChargeStuYearApi/generateqrcode', postData ).then((res)=> {
  249. this.HIDE_LOADING();
  250. if(!res){
  251. return
  252. }
  253. this.qrCodeUrl = this.CONFIG("webHost")+res.imgUrl
  254. });
  255. }
  256. if(action == "getPayRes"){
  257. this.StuInfoFreshData = {}
  258. this.PayFeeTotal = ''
  259. this.payfeetotal = ''
  260. this.SJAmountReceiveSendFeeManagement = ''
  261. this.FinaChargesStandardList = []
  262. this.init()
  263. }
  264. },
  265. lookInvioce(){
  266. this.NAV_TO("./payInvioce?keyValue="+this.pageInfo.FSYId)
  267. },
  268. getpayfeetotal(){
  269. let value = 0
  270. this.FinaChargesStandardList.map(item=>{
  271. let strValue = item.NeedToPay.toString()
  272. // if(strValue.split(".")[1]&&strValue.split(".")[1].length>2){
  273. // item.SJAmount = strValue.match(/^\d+(?:\.\d{0,2})?/)
  274. // }
  275. if(/^-?\d+(,\d{3})*(\.\d{1,2})?$/.test(item.NeedToPay)){
  276. if(strValue.indexOf(".") == -1&&Number(item.NeedToPay)%1 === 0){
  277. item.NeedToPay = Number(item.NeedToPay)
  278. }
  279. value = this.numSub(value,Number(item.NeedToPay))
  280. // value += Number(item.SJAmount)
  281. }
  282. })
  283. this.payfeetotal = value
  284. },
  285. changeIpnutEdit(edit){
  286. let item = JSON.parse(JSON.stringify(this.item))
  287. item.fieldsData = item.fieldsData.map((item1)=>{
  288. if(["NeedToPay"].includes(item1.field)){
  289. item1.edit = edit
  290. }
  291. return item1
  292. })
  293. this.item = item
  294. },
  295. numSub(num1, num2) {
  296. var baseNum, baseNum1, baseNum2;
  297. var precision;// 精度
  298. try {
  299. baseNum1 = num1.toString().split(".")[1].length;
  300. } catch (e) {
  301. baseNum1 = 0;
  302. }
  303. try {
  304. baseNum2 = num2.toString().split(".")[1].length;
  305. } catch (e) {
  306. baseNum2 = 0;
  307. }
  308. baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
  309. precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
  310. return ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed(precision);
  311. }
  312. },
  313. created() {
  314. this.init()
  315. }
  316. }
  317. </script>
  318. <style lang="less" scoped>
  319. @import '~@/common/css/customlist.less';
  320. @import '~@/common/css/sidepage.less';
  321. </style>