form.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. <template>
  2. <!-- 添加或修改项目信息对话框 -->
  3. <div class="el-drawer__wrapper">
  4. <el-drawer :title="title" v-model="visible" direction="rtl" size="100%">
  5. <div class="page-container form-container">
  6. <div class="form-btns-container">
  7. <span class="title-label"><el-icon>
  8. <Document />
  9. </el-icon>
  10. 收款信息</span>
  11. <el-button v-if="editStatus" type="primary" size="small" icon="Finished" @click="submitForm">保存</el-button>
  12. <el-button v-show="form.status == 1 && auth.hasPermi('business:collection:return')" type="warning" size="small" icon="Finished" @click="returnZero"
  13. >退回</el-button>
  14. <el-button v-show="(!editStatus && form.verifyDate == null)&& auth.hasPermi('business:collection:edit') " type="warning" size="small" icon="Edit"
  15. @click="editStatus = true">修改</el-button>
  16. <el-button v-if="form.id && editStatus" type="info" size="small" icon="Close"
  17. @click="reForm()">取消修改</el-button>
  18. <el-button v-show="(form.id && !editStatus && form.verifyDate == null)
  19. && auth.hasPermi('business:collection:verify')"
  20. type="primary" size="small" icon="Check"
  21. @click="verifyHandler">收款审核</el-button>
  22. <div class="screen-btn" @click="handleScreen">
  23. <template v-if="!isFullscreen">
  24. <i class="fa fa-window-maximize" aria-hidden="true" />
  25. <!-- <span>全屏</span> -->
  26. </template>
  27. <template v-else>
  28. <i class="fa fa-window-restore" aria-hidden="true" />
  29. <!-- <span>还原</span> -->
  30. </template>
  31. </div>
  32. <div class="close-btn" @click="cancel">
  33. <i class="fa fa-times" aria-hidden="true" />
  34. <!-- <span>关闭</span> -->
  35. </div>
  36. </div>
  37. <div class="Y-scrollbar" style="
  38. position: absolute;
  39. top: 32px;
  40. bottom: 0;
  41. width: 100%;
  42. overflow: auto;
  43. "></div>
  44. <el-form ref="orderRef" class="master-container" size="small" :model="form" :rules="rules" label-width="100px">
  45. <el-row :gutter="30">
  46. <el-col :span="6">
  47. <el-form-item label="收款流水号:">
  48. <el-input v-if="editStatus" v-model.trim="form.flowNo" disabled size="small" type="text"
  49. placeholder="收款流水号 点击保存时自动生成" :clearable="true" />
  50. <span v-else>{{ form.flowNo }}</span>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="6">
  54. <el-form-item label="收款账户:" prop="subsidiaryName">
  55. <el-autocomplete v-if="editStatus" :fetch-suggestions="querySearchAccountAsync" :trigger-on-focus="true"
  56. v-model="form.subsidiaryName" placeholder="请输入收款账户" style="width: 100%" popper-class="my-autocomplete"
  57. @select="handleSelectAccount">
  58. <template #default="{ item }">
  59. <div style="
  60. display: flex;
  61. flex-direction: row;
  62. justify-content: space-between;
  63. ">
  64. <div class="name" style="font-size: 12px">
  65. {{ item.name }}
  66. </div>
  67. <span class="code" style="font-size: 10px; color: darkgrey">{{ item.code }}</span>
  68. </div>
  69. </template>
  70. </el-autocomplete>
  71. <span v-else>{{ form.subsidiaryName }}</span>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="6">
  75. <el-form-item label="收款开户行:" prop="subsidiaryBankName">
  76. <el-input v-if="editStatus" v-model.trim="form.subsidiaryBankName" size="small" type="text"
  77. placeholder="开户行" :clearable="true" :readonly="true" />
  78. <span v-else>{{ form.subsidiaryBankName }}</span>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="6">
  82. <el-form-item label="收款账号:" prop="subsidiaryBankAccount">
  83. <el-input v-if="editStatus" v-model.trim="form.subsidiaryBankAccount" size="small" type="text"
  84. placeholder="账号" :clearable="true" :readonly="true" />
  85. <span v-else>{{ form.subsidiaryBankAccount }}</span>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="6">
  89. <el-form-item label="付款名称:" prop="applyName">
  90. <el-input v-if="editStatus" v-model.trim="form.applyName" size="small" type="text" placeholder="付款名称"
  91. :clearable="true" />
  92. <span v-else>{{ form.applyName }}</span>
  93. </el-form-item>
  94. </el-col>
  95. <el-col :span="6">
  96. <el-form-item label="付款账号:" prop="appyAccount">
  97. <el-input v-if="editStatus" v-model.trim="form.appyAccount" size="small" type="text" placeholder="付款账号"
  98. :clearable="true" />
  99. <span v-else>{{ form.appyAccount }}</span>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="6">
  103. <el-form-item label="到账日期:" prop="arriveDate">
  104. <el-date-picker v-if="editStatus" v-model.trim="form.arriveDate" size="small" :clearable="true"
  105. style="width: 100%" format="YYYY-MM-DD" value-format="YYYY-MM-DD" align="center" type="date"
  106. placeholder="到账日期" />
  107. <span v-else>{{ form.arriveDate }}</span>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="6">
  111. <el-form-item label="到账时间:" prop="arriveTime">
  112. <el-time-select v-if="editStatus" style="width: 100%" v-model.trim="form.arriveTime"
  113. :picker-options="timeOptions" placeholder="选择时间" />
  114. <span v-else>{{ form.arriveTime }}</span>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="6">
  118. <el-form-item label="客户名称:" prop="companyName">
  119. <el-link :underline="false" type="primary" @click="handleInfo(form)">{{ form.companyName }}</el-link>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="6">
  123. <el-form-item label="合同编号:" prop="remark">
  124. <el-link v-if="auth.hasPermi('business:archive:order:cwview')" :underline="false" type="primary" @click="handleContract(form)">{{ form.contractNo }}</el-link>
  125. <span v-else>{{form.contractNo}}</span>
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="6">
  129. <el-form-item label="应收款金额:" prop="remark">
  130. <span>{{ rowNum(form.contractAmount) }}</span>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="6">
  134. <el-form-item label="未收款金额:" prop="remark">
  135. <span>{{ rowNum(form.nonpaymentAmount) }}</span>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="6">
  139. <el-form-item label="收款金额:" required>
  140. <el-input-number v-if="editStatus" v-model.trim="form.arriveAmount" size="small" placeholder="收款金额"
  141. :clearable="true" disabled :precision="2" controls-position="right" :controls="false" @change="amountChange" />
  142. <span v-else>{{ rowNum(form.arriveAmount) }}</span>
  143. </el-form-item>
  144. </el-col>
  145. <el-col :span="6">
  146. <el-form-item label="订单备注:">
  147. <span style="word-break: break-all">{{
  148. form.orderRemark
  149. }}</span>
  150. </el-form-item>
  151. </el-col>
  152. <el-col v-if="form.status === 1" :span="6">
  153. <el-form-item label="审核意见:" required>
  154. <span>{{ form.verifyComment }}</span>
  155. </el-form-item>
  156. </el-col>
  157. <el-col v-if="form.status === 2" :span="6">
  158. <el-form-item label="驳回原因:" required>
  159. <span>{{ form.verifyComment }}</span>
  160. </el-form-item>
  161. </el-col>
  162. <el-col :span="6">
  163. <el-form-item label="收款备注:">
  164. <el-input v-if="editStatus" v-model.trim="form.remark" size="small" type="text" placeholder="收款备注"
  165. :clearable="true" />
  166. <span v-else style="word-break: break-all">{{
  167. form.remark
  168. }}</span>
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="6">
  172. <el-form-item label="签单类型:" prop="isNew">
  173. <el-radio-group v-model="form.isNew" disabled v-if="editStatus">
  174. <el-radio :label="0">新签</el-radio>
  175. <el-radio :label="1">续签</el-radio>
  176. </el-radio-group>
  177. <span v-else>{{ form.isNew === 0 ? '新签' : '续签' }}</span>
  178. </el-form-item>
  179. </el-col>
  180. <el-col :span="6">
  181. <el-form-item label="是否为项目:" prop="isProject">
  182. <el-radio-group v-model="form.isProject" v-if="editStatus">
  183. <el-radio :label="0">项目</el-radio>
  184. <el-radio :label="1">非项目</el-radio>
  185. </el-radio-group>
  186. <span v-else>{{ form.isProject !== undefined && form.isProject !== null ? (form.isProject === 0 ? '项目' :
  187. '非项目') : '' }}</span>
  188. </el-form-item>
  189. </el-col>
  190. <el-col :span="6">
  191. <el-form-item label="项目编号:" prop="projectNo">
  192. <el-input v-if="editStatus" v-model.trim="form.projectNo" size="small" type="text" placeholder="项目编号"
  193. :clearable="true" />
  194. <span v-else>{{ form.projectNo }}</span>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="6">
  198. <el-form-item label="项目名称:" prop="projectName">
  199. <el-input v-if="editStatus" v-model.trim="form.projectName" size="small" type="text" placeholder="项目名称"
  200. :clearable="true" />
  201. <span v-else>{{ form.projectName }}</span>
  202. </el-form-item>
  203. </el-col>
  204. <el-col :span="6">
  205. <el-form-item label="项目主体名称:" prop="projectMainName">
  206. <el-input v-if="editStatus" v-model.trim="form.projectMainName" size="small" type="text"
  207. placeholder="项目主体名称" :clearable="true" />
  208. <span v-else>{{ form.projectMainName }}</span>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="6">
  212. <el-form-item label="审核时间" prop="verifyDate">
  213. <span>{{ form.verifyDate }}</span>
  214. </el-form-item>
  215. </el-col>
  216. <el-col :span="6">
  217. <el-form-item label="制表时间" prop="createTime">
  218. <span>{{ form.createTime }}</span>
  219. </el-form-item>
  220. </el-col>
  221. <el-col :span="6">
  222. <el-form-item label="申请人:">
  223. <span>{{ form.applierName }}</span>
  224. </el-form-item>
  225. </el-col>
  226. <el-col :span="6">
  227. <el-form-item label="甲方:">
  228. <span>{{ form.boss }}</span>
  229. </el-form-item>
  230. </el-col>
  231. <el-col :span="6">
  232. <el-form-item label="乙方:">
  233. <span>{{ form.party }}</span>
  234. </el-form-item>
  235. </el-col>
  236. </el-row>
  237. </el-form>
  238. <div class="details-container">
  239. <el-row :gutter="2" style="height: 100%">
  240. <el-col :span="18">
  241. <div class="details-head">
  242. <div class="title">
  243. <i class="fa fa-th-list" aria-hidden="true" /> 收款明细
  244. </div>
  245. </div>
  246. <div class="details-body">
  247. <el-table ref="filesTable" :data="form.details" size="small" height="100%" border
  248. header-row-class-name="list-header-row" highlight-current-row>
  249. <el-table-column type="index" label="序号" width="47" align="center" />
  250. <el-table-column label="任务名称" prop="taskTypeName" align="center" show-overflow-tooltip>
  251. </el-table-column>
  252. <el-table-column label="说明" prop="explain" align="center" show-overflow-tooltip />
  253. <el-table-column label="任务金额" prop="amount" width="150" header-align="center" align="right">
  254. <template #default="scope">
  255. <span>{{ rowNum(scope.row.amount) }}</span>
  256. </template>
  257. </el-table-column>
  258. <el-table-column label="已收款金额" prop="arrived" width="150" align="right" header-align="center">
  259. <template #default="scope">
  260. <span>{{ rowNum(scope.row.arrived) }}</span>
  261. </template>
  262. </el-table-column>
  263. <el-table-column label="待收款金额" width="150" align="center">
  264. <template #default="scope">
  265. {{
  266. rowNum((Number(scope.row.amount) || 0) - (Number(scope.row.arrived) || 0))
  267. }}
  268. </template>
  269. </el-table-column>
  270. <el-table-column label="本次收款金额" prop="arriveAmount" width="150" header-align="center" align="right">
  271. <template #default="scope">
  272. <template v-if="editStatus">
  273. <el-input-number v-model="scope.row.arriveAmount" size="small" :min="0.0" placeholder="本次收款金额"
  274. :precision="2" :controls="false" style="width: 100%" @change="
  275. (arg) =>
  276. amountChangeHandler(
  277. arg,
  278. scope.row,
  279. 'arriveAmount'
  280. )
  281. " />
  282. </template>
  283. <template v-else>{{
  284. rowNum(scope.row.arriveAmount)
  285. }}</template>
  286. </template>
  287. </el-table-column>
  288. <el-table-column label="备注" prop="remark" width="250" align="center">
  289. <template #default="scope">
  290. <template v-if="editStatus">
  291. <el-input v-model="scope.row.remark" placeholder="备注" size="small" />
  292. </template>
  293. <template v-else>{{ scope.row.remark }}</template>
  294. </template>
  295. </el-table-column>
  296. </el-table>
  297. </div>
  298. </el-col>
  299. <el-col :span="6">
  300. <div class="details-head">
  301. <div class="title">
  302. <i class="fa fa-th-list" aria-hidden="true" />
  303. <span style="color: red"><i style="color: red" /> *</span>
  304. </div>
  305. <el-upload v-if="editStatus" action="#" :http-request="upload" :with-credentials="true"
  306. :show-file-list="false" multiple>
  307. <el-button size="small" type="primary" icon="Upload">点击上传</el-button>
  308. </el-upload>
  309. </div>
  310. <div class="details-body">
  311. <el-table ref="filesTable" :data="form.files" size="small" height="100%" border
  312. header-row-class-name="list-header-row" highlight-current-row>
  313. <el-table-column type="index" label="序号" width="47" align="center" />
  314. <el-table-column label="文件名" prop="originalFileName" align="center" min-width="200"
  315. show-overflow-tooltip>
  316. <template #default="scope">
  317. <el-button size="small" type="primary" link @click="openFile(scope.row)">{{
  318. scope.row.originalFileName }}</el-button>
  319. </template>
  320. </el-table-column>
  321. <el-table-column label="操作" min-width="60" align="center">
  322. <template #default="scope">
  323. <div v-if="editStatus">
  324. <el-button size="small" link type="danger"
  325. @click="handlerDelAttach(scope.row, scope.$index)">删除</el-button>
  326. </div>
  327. </template>
  328. </el-table-column>
  329. </el-table>
  330. </div>
  331. </el-col>
  332. </el-row>
  333. </div>
  334. </div>
  335. </el-drawer>
  336. <el-dialog title="审核详情" v-model="rejectOpen" width="500px" append-to-body draggable :close-on-click-modal="false">
  337. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  338. <el-form-item label="审核状态">
  339. <el-select style="width: 100%" v-model.trim="form.verifyStatus" placeholder="请选择" size="small">
  340. <el-option v-for="i in verified" :key="i.value" :label="i.label" :value="i.value" />
  341. </el-select>
  342. </el-form-item>
  343. <el-form-item label="确认所属时间" required>
  344. <el-date-picker style="width: 100%" v-model.trim="form.actuallyDate" size="small" :clearable="true"
  345. format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" align="center" type="datetime"
  346. placeholder="确认所属时间" />
  347. </el-form-item>
  348. <el-form-item :label="form.verifyStatus === 2 ? '驳回原因' : '审核意见'" :prop="verifyComment">
  349. <el-input type="textarea" maxlength="200" show-word-limit v-model.trim="form.verifyComment" :rows="3"
  350. placeholder="请输入审核意见" />
  351. </el-form-item>
  352. <el-form-item label="附件">
  353. <el-upload action="#" :http-request="upload2" :with-credentials="true" :show-file-list="false" multiple
  354. :limit="5">
  355. <el-button size="small" type="primary" icon="Upload">点击上传</el-button>
  356. </el-upload>
  357. <el-table ref="dbTable" :data="form.evidenceFiles" size="small" border header-row-class-name="list-header-row"
  358. row-class-name="list-row">
  359. <el-table-column label="文件名" prop="originalFileName" align="center" show-overflow-tooltip>
  360. <template #default="scope">
  361. <el-button size="small" type="text" @click="openFile(scope.row)">{{
  362. scope.row.originalFileName == ""
  363. ? "打开文件"
  364. : scope.row.originalFileName
  365. }}</el-button>
  366. </template>
  367. </el-table-column>
  368. <!-- <el-table-column
  369. label="文件类型"
  370. width="80"
  371. prop="fileType"
  372. align="center"
  373. /> -->
  374. <el-table-column label="操作" width="80" prop="fileType" align="center">
  375. <template #default="scope">
  376. <el-button size="small" link type="danger"
  377. @click="handlerEportFilesDel(scope.row, scope.$index)">删除</el-button>
  378. </template>
  379. </el-table-column>
  380. </el-table>
  381. </el-form-item>
  382. </el-form>
  383. <template #footer>
  384. <div class="dialog-footer">
  385. <el-button type="primary" icon="Finished" size="small" @click="verifyUpload()">确 定</el-button>
  386. <el-button icon="Close" size="small" @click="rejectCancel">取 消</el-button>
  387. </div>
  388. </template>
  389. </el-dialog>
  390. <company-form ref="companyRef" :get-list="getList"></company-form>
  391. <contract-form ref="contractRef" :get-list="getList" />
  392. </div>
  393. </template>
  394. <script setup>
  395. import { uploadFile } from "@/api/tool/file";
  396. import auth from "@/plugins/auth";
  397. // import {
  398. // getOrder,
  399. // initTaskTypes,
  400. // addOrder,
  401. // updateOrder,
  402. // verifyOrder,
  403. // alterOrder,
  404. // dissolutionOrder,
  405. // } from "@/api/business/crm/contract";
  406. import {
  407. listContract,
  408. listAccount,
  409. getCollection,
  410. getCollectionByContract,
  411. saveCollection,
  412. verifyCollection, setCollectionZero, getCollectionDetail,
  413. } from "@/api/business/financial/collection";
  414. import { listSource } from "@/api/settings/source";
  415. import { listCompany } from "@/api/business/crm/company";
  416. import { listUser } from "@/api/system/user";
  417. import CustomerFormCom from "@/components/CustomerFormCom";
  418. import { formatDate } from "@/utils/index";
  419. import companyForm from "@/views/business/crm/company/formView.vue";
  420. import contractForm from "@/views/business/crm/order/formView.vue";
  421. import { ref } from "vue";
  422. import useUserStore from "@/store/modules/user";
  423. import match from "@/utils/match";
  424. const { proxy } = getCurrentInstance();
  425. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  426. /** 父组件传参 */
  427. const props = defineProps({
  428. getList: {
  429. type: Function,
  430. default: () => { },
  431. },
  432. });
  433. const { getList } = toRefs(props);
  434. /** 字典数组区 */
  435. const { virtual_address } = proxy.useDict("virtual_address");
  436. /** 表单抽屉 页变量 */
  437. const title = ref("");
  438. const loading = ref(false);
  439. const multiple = ref(true);
  440. const visible = ref(false);
  441. const editStatus = ref(false);
  442. const sourceCategories = ref([]);
  443. const type = ref("");
  444. const rejectOpen = ref(false);
  445. const detailEmpty = {
  446. id: null,
  447. taskTypeName: "",
  448. taskTypeId: null,
  449. serviceNum: undefined,
  450. freeNum: undefined,
  451. price: undefined,
  452. amount: undefined,
  453. addressStyle: undefined,
  454. address: undefined,
  455. fictionAddressId: undefined,
  456. tenantId: undefined,
  457. province: "",
  458. city: "",
  459. district: "",
  460. addressStyle: 1,
  461. provinceId: undefined,
  462. processes: [],
  463. defaultProcesses: [],
  464. };
  465. const provinces = ref(proxy.region.getProvinces());
  466. provinces.value.unshift({ code: "", name: "全部" });
  467. const cities = ref([]);
  468. const districts = ref([]);
  469. const contractEmpty = {
  470. serviceType: 1,
  471. contractType: 0,
  472. formDate: formatDate(new Date(), "YYYY-MM-DD"),
  473. signerId: useUserStore().user.userId,
  474. signerName: useUserStore().user.nickName,
  475. files: [],
  476. };
  477. const isFullscreen = ref(false);
  478. const webHost = import.meta.env.VITE_APP_BASE_API;
  479. const data = reactive({
  480. form: {},
  481. rules: {},
  482. timeOptions: { start: "08:30", step: "00:15", end: "18:30" },
  483. verified: [
  484. {
  485. value: 0,
  486. label: "未审核",
  487. },
  488. {
  489. value: 1,
  490. label: "通过",
  491. },
  492. {
  493. value: 2,
  494. label: "不通过",
  495. },
  496. ],
  497. });
  498. const { form, rules, timeOptions, verified } = toRefs(data);
  499. /*********************** 方法区 ****************************/
  500. /** 打开抽屉 */
  501. function open(id) {
  502. reset();
  503. visible.value = true;
  504. editStatus.value = true;
  505. getCollection(id).then((res) => {
  506. form.value = res.data;
  507. form.value.actuallyDate = null;
  508. console.log("form23", form.value);
  509. editStatus.value = false;
  510. });
  511. }
  512. /** 取消按钮 */
  513. function cancel() {
  514. visible.value = false;
  515. reset();
  516. }
  517. function handleInfo(row) {
  518. proxy.$refs.companyRef.open(row.companyId);
  519. }
  520. function handleContract() {
  521. proxy.$refs.contractRef.open(form.value.contractId);
  522. }
  523. // 数字格式化
  524. function rowNum(num) {
  525. if (!num) {
  526. return;
  527. }
  528. num = num.toLocaleString(); // 3,000
  529. if (num.indexOf(".") == -1) {
  530. num = num + ".00"; //3,000.00
  531. } else if (num.charAt(num.indexOf(".") == num.length - 2)) {
  532. num = num;
  533. }
  534. return num;
  535. }
  536. /** 表单重置 */
  537. function reset() {
  538. form.value = JSON.parse(JSON.stringify(contractEmpty));
  539. console.log("重置表单", form.value);
  540. type.value = "";
  541. // console.log(form)
  542. // proxy.resetForm("orderRef");
  543. }
  544. function returnZero() {
  545. proxy.$modal
  546. .confirm("是否确认退回")
  547. .then(function () {
  548. form.value.status = 0;
  549. return setCollectionZero(form.value.id)
  550. })
  551. .then(() => {
  552. visible.value = false;
  553. getList.value();
  554. proxy.$modal.msgSuccess("退回成功");
  555. })
  556. .catch(() => { });
  557. }
  558. /** 全屏缩放 */
  559. function handleScreen() {
  560. const dom = document.querySelector(
  561. ".list-container > .el-drawer__wrapper > .el-overlay"
  562. );
  563. isFullscreen.value = !isFullscreen.value;
  564. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  565. }
  566. /** 提交按钮 */
  567. async function submitForm() {
  568. // 应收款金额 和明细比较 如果大于应收内容 提示 当前的合同提过的收款申请总金额超过当前合同金额,不可提交,如有需要请跟财务人员联系
  569. const res = await getCollectionDetail(form.value.contractId);
  570. if (res.data == null || res.data.length == 0) {
  571. for (let i = 0; i < form.value.details.length; i++) {
  572. let item = form.value.details[i];
  573. const Amount = (Number(item.countAmount) || 0)*1000 - (Number(item.reviewAmount) || 0)*1000;
  574. if ( item.arriveAmount + (Amount/1000) > (Number(item.amount) || 0)) {
  575. proxy.$modal.msgError("当前的" + item.taskTypeName + "本次收款金额超过系统内存在的收款金额,不可提交,请联系财务人员。");
  576. return false;
  577. }
  578. }
  579. } else {
  580. for (let i = 0; i < form.value.details.length; i++) {
  581. let item = form.value.details[i];
  582. let countAmount = 0;
  583. for (let j = 0; j < res.data.length; j++) {
  584. let match = res.data[j];
  585. if (item.taskTypeId == match.taskTypeId) {
  586. countAmount += match.arriveAmount;
  587. }
  588. }
  589. if (item.amount < match.add(item.arriveAmount)) {
  590. proxy.$modal.msgError("当前的" + item.taskTypeName + "本次收款金额超过系统内存在的收款金额,不可提交,请联系财务人员。");
  591. return false;
  592. }
  593. // const amount = (rowNum((Number(item.amount) || 0) - (Number(item.arrived) || 0))) < (Number(item.arriveAmount) || 0)
  594. const diff = (Number(item.amount) || 0)*1000 - (Number(item.arrived) || 0)*1000;
  595. const Amount = (Number(item.countAmount) || 0)*1000 - (Number(item.reviewAmount) || 0)*1000;
  596. if ( item.arriveAmount + (Amount/1000) > (Number(item.amount) || 0)) {
  597. proxy.$modal.msgError("当前的" + item.taskTypeName + "本次收款金额超过系统内存在的收款金额,不可提交,请联系财务人员。");
  598. return false;
  599. }
  600. }
  601. }
  602. if (form.value.arriveAmount > form.value.contractAmount) {
  603. proxy.$modal.msgError("实际收款金额不能大于合同收款金额");
  604. return;
  605. }
  606. proxy.$refs["orderRef"].validate((valid) => {
  607. if (valid && detailValid()) {
  608. const formValue = form.value;
  609. saveCollection(formValue).then((res) => {
  610. open(form.value.id);
  611. getList.value();
  612. proxy.$modal.msgSuccess("保存成功");
  613. });
  614. }
  615. });
  616. }
  617. function detailValid() {
  618. // 20240109 暂时附件非必填。
  619. // if (form.value.files.length === 0) {
  620. // proxy.$modal.msgError("收款附件为空");
  621. // return false;
  622. // }
  623. return true;
  624. }
  625. /** 查询表单信息 */
  626. function getForm() {
  627. loading.value = true;
  628. getOrder(form.value.id).then((response) => {
  629. loading.value = false;
  630. form.value = response.data;
  631. });
  632. }
  633. function handleServiceTypeClick(tab) {
  634. computedService();
  635. }
  636. function verifyHandler() {
  637. // proxy.$modal
  638. // .confirm("是否确认审核?")
  639. // .then((_) => {
  640. // verifyUpload(1);
  641. // })
  642. // .catch((_) => {
  643. // proxy.$modal.msg("取消审核");
  644. // });
  645. rejectOpen.value = true;
  646. }
  647. function rejectHandler() {
  648. rejectOpen.value = true;
  649. }
  650. function rejectCancel() {
  651. rejectOpen.value = false;
  652. rejectReset();
  653. }
  654. function rejectReset() { }
  655. function rejectSubmitHandler() {
  656. if (form.value.verifyRemark === "" || form.value.verifyRemark == null) {
  657. proxy.$modal.msgError("请填写驳回原因");
  658. return;
  659. }
  660. }
  661. async function verifyUpload() {
  662. // const formValue = proxy.deepClone(form.value);
  663. // formValue.verifyStatus = status;
  664. // formValue.status = status;
  665. if (form.value.verifyStatus === 0) {
  666. proxy.$modal.msgError("请选择审核结果");
  667. return;
  668. }
  669. if (form.value.actuallyDate == null || form.value.actuallyDate === "") {
  670. proxy.$modal.msgError("请选择确认所属时间");
  671. return;
  672. }
  673. if (
  674. form.value.verifyStatus === 2 &&
  675. (form.value.verifyComment == null || form.value.verifyComment === "")
  676. ) {
  677. proxy.$modal.msgError("请输入驳回原因");
  678. return;
  679. }
  680. // if (
  681. // form.value.evidenceFiles == null ||
  682. // form.value.evidenceFiles.length === 0 || form.value.evidenceFiles.length>5
  683. // ) {
  684. // proxy.$modal.msgError("请上传凭证并至多上传5个");
  685. // return;
  686. // }
  687. // 应收款金额 和明细比较 如果大于应收内容 提示 当前的合同提过的收款申请总金额超过当前合同金额,不可提交,如有需要请跟财务人员联系
  688. if(form.value.verifyStatus === 1){
  689. const res = await getCollectionDetail(form.value.contractId);
  690. if (res.data == null || res.data.length == 0) {
  691. for (let i = 0; i < form.value.details.length; i++) {
  692. let item = form.value.details[i];
  693. const Amount = (Number(item.countAmount) || 0)*1000 - (Number(item.reviewAmount) || 0)*1000;
  694. if ( item.arriveAmount + (Amount/1000) > (Number(item.amount) || 0)) {
  695. proxy.$modal.msgError("当前的" + item.taskTypeName + "本次收款金额超过系统内存在的收款金额,不可提交,请联系财务人员。");
  696. return false;
  697. }
  698. }
  699. } else {
  700. for (let i = 0; i < form.value.details.length; i++) {
  701. let item = form.value.details[i];
  702. let countAmount = 0;
  703. for (let j = 0; j < res.data.length; j++) {
  704. let match = res.data[j];
  705. if (item.taskTypeId == match.taskTypeId) {
  706. countAmount += match.arriveAmount;
  707. }
  708. }
  709. if (item.amount < match.add(item.arriveAmount)) {
  710. proxy.$modal.msgError("当前的" + item.taskTypeName + "收款申请总金额超过当前服务金额,不可提交,请联系财务人员。");
  711. return false;
  712. }
  713. const diff = (Number(item.amount) || 0)*1000 - (Number(item.arrived) || 0)*1000;
  714. const Amount = (Number(item.countAmount) || 0)*1000 - (Number(item.reviewAmount) || 0)*1000;
  715. if ( item.arriveAmount + (Amount/1000) > (Number(item.amount) || 0)) {
  716. proxy.$modal.msgError("当前的" + item.taskTypeName + "本次收款金额超过系统内存在的收款金额,不可提交,请联系财务人员。");
  717. return false;
  718. }
  719. }
  720. }
  721. }
  722. if (form.value.arriveAmount > form.value.contractAmount) {
  723. proxy.$modal.msgError("实际收款金额不能大于合同收款金额");
  724. return;
  725. }
  726. form.value.status = form.value.verifyStatus;
  727. form.value.arriveStatus = form.value.status === 1 ? 1 : 0;
  728. verifyCollection(form.value).then((res) => {
  729. open(form.value.id);
  730. getList.value();
  731. rejectCancel();
  732. proxy.$modal.mseSuccess("保存成功");
  733. });
  734. }
  735. /** 文件上传 */
  736. function upload(param) {
  737. const fileForm = new FormData();
  738. fileForm.append("file", param.file);
  739. uploadFile(fileForm).then((res) => {
  740. if (res.code === 200) {
  741. const file = {};
  742. file.fileName = res.newFileName;
  743. file.url = res.url;
  744. file.originalFileName = res.originalFilename;
  745. file.fileUrl = res.fileName;
  746. console.log(11212, form.value.files);
  747. form.value.files.push(file);
  748. }
  749. });
  750. }
  751. function upload2(param) {
  752. const formData = new FormData();
  753. formData.append("file", param.file);
  754. uploadFile(formData).then((res) => {
  755. if (res.code === 200) {
  756. const file = {};
  757. file.fileName = res.newFileName;
  758. file.url = res.url;
  759. file.fileType =
  760. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  761. file.originalFileName = res.originalFilename;
  762. file.fileUrl = res.fileName;
  763. console.log(11212, file);
  764. if (form.value.evidenceFiles == null) {
  765. form.value.evidenceFiles = [];
  766. }
  767. form.value.evidenceFiles.push(file);
  768. }
  769. });
  770. }
  771. function handleDelFile(index) {
  772. form.value.files.splice(index, 1);
  773. }
  774. function amountChangeHandler(arg, row, field) {
  775. computeTotalAmount();
  776. }
  777. function handlerEportFilesDel(row, index) {
  778. proxy.$modal
  779. .confirm("确定删除吗?")
  780. .then((_) => {
  781. form.value.evidenceFiles.splice(index, 1);
  782. })
  783. .catch((_) => {
  784. proxy.$modal.msg("已取消删除");
  785. });
  786. }
  787. function computeTotalAmount() {
  788. let amount = 0;
  789. for (let index = 0; index < form.value.details.length; index++) {
  790. const element = form.value.details[index];
  791. amount += element.arriveAmount == null ? 0 : element.arriveAmount;
  792. }
  793. form.value.arriveAmount = amount;
  794. }
  795. function amountChange() {
  796. let amount = 0;
  797. if (form.value.details.length > 0) {
  798. for (let i = 0; i < form.value.details.length; i++) {
  799. amount = amount + form.value.details[i].arriveAmount;
  800. }
  801. // 判断到款状态
  802. form.value.arriveAmount = amount;
  803. if (form.value.arriveAmount > 0)
  804. form.value.arriveStatus =
  805. form.value.arriveAmount === form.value.amount ? 1 : 2;
  806. else form.value.arriveStatus = 0;
  807. }
  808. }
  809. function querySearchAccountAsync(queryString, cb) {
  810. const query =
  811. queryString.length > 0
  812. ? { keyword: queryString, pageSize: 20, pageNum: 1 }
  813. : { pageSize: 20, pageNum: 1 };
  814. listAccount(query).then((res) => {
  815. cb(res.rows);
  816. });
  817. }
  818. function handleSelectAccount(item) {
  819. form.value.subsidiaryName = item.name;
  820. form.value.subsidiaryBankName = item.accountOpen;
  821. form.value.subsidiaryBankAccount = item.accountNum;
  822. }
  823. function openFile(row) {
  824. window.open(`${baseUrl}${row.fileUrl}`);
  825. }
  826. function handlerDelAttach(row, index) {
  827. proxy.$modal
  828. .confirm("确认删除该项么?")
  829. .then((_) => {
  830. form.value.files.splice(index, 1);
  831. })
  832. .catch((err) => {
  833. proxy.$modal.msgError("取消删除");
  834. });
  835. }
  836. const reForm = () =>{
  837. open(form.value.id);
  838. }
  839. /** 暴露给父组件的方法 */
  840. defineExpose({
  841. open,
  842. });
  843. </script>