ReimburseMy.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <template>
  2. <div class="reimburseMy">
  3. <div class="reimburseMy-table">
  4. <el-button type="primary" icon="Plus" style="margin-bottom: 10px;"
  5. @click="showDrawer('news', null)">新增报销</el-button>
  6. <el-table :data="data.tableData" style="width: 100%" border>
  7. <el-table-column :show-overflow-tooltip="true" label="序号" type="index" width="70" />
  8. <!-- <el-table-column :show-overflow-tooltip="true" prop="Id" label="ID" width="180" /> -->
  9. <el-table-column :show-overflow-tooltip="true" prop="T_money" label="报销总金额" width="180" />
  10. <el-table-column :show-overflow-tooltip="true" prop="T_approval_money" label="审批总金额" width="100" />
  11. <el-table-column :show-overflow-tooltip="true" prop="T_remit" label="打款金额" width="180" />
  12. <el-table-column :show-overflow-tooltip="true" label="状态" width="150">
  13. <!-- 0 删除 1 未提交审核 2待审核 审核通过 审核不通过 5 已部分打款 6已全部打款 -->
  14. <template #default="scope">
  15. <el-tag v-if="scope.row.T_State == 1" class="ml-2" type="danger">未提交审核</el-tag>
  16. <el-tag v-if="scope.row.T_State == 2" class="ml-2" type="warning">待审核</el-tag>
  17. <el-tag v-if="scope.row.T_State == 3">审核通过</el-tag>
  18. <el-tag v-if="scope.row.T_State == 4" class="ml-2" type="danger">审核不通过</el-tag>
  19. <el-tag v-if="scope.row.T_State == 5" type="warning">已部分打款</el-tag>
  20. <el-tag v-if="scope.row.T_State == 6">已全部打款</el-tag>
  21. </template>
  22. </el-table-column>
  23. <el-table-column :show-overflow-tooltip="true" prop="T_date" label="提交日期" width="220" />
  24. <el-table-column label="操作" fixed="right" min-width="350">
  25. <template #default="scope">
  26. <el-button @click="showDrawer('det', scope.row)">详情</el-button>
  27. <el-button @click="showDrawer('edi', scope.row)" v-if="scope.row.T_State != 6 &&
  28. scope.row.T_State != 5 && scope.row.T_State != 3
  29. ">编辑</el-button>
  30. <el-button @click="delReimbu(scope.row)" type="danger" v-if="scope.row.T_State != 6 &&
  31. scope.row.T_State != 5 && scope.row.T_State != 3
  32. ">删除</el-button>
  33. <el-button @click="showDrawer('sub', scope.row)" type="primary" v-if="scope.row.T_State != 6 &&
  34. scope.row.T_State != 5 && scope.row.T_State != 3
  35. ">提交审核</el-button>
  36. </template>
  37. </el-table-column>
  38. </el-table>
  39. <el-pagination v-model:current-page="data.pages.page" layout="total, prev, pager, next, jumper"
  40. v-model:page-size="data.pages.page_z" :total="data.total" @current-change="handleCurrentChange"
  41. style="margin-top: 20px;" />
  42. </div>
  43. <el-drawer v-model="data.drawer" :title="data.drawerTiti" direction="rtl" :before-close="handleClose" size="100%">
  44. <el-form :model="data.fromData" label-position="top">
  45. <el-form-item label="报销总金额">
  46. <div style="display: flex;">
  47. <el-input v-model.number="data.fromData.T_money" style="flex: 1;"
  48. :disabled="data.drawerTiti == '详情' ? true : false" />
  49. <span style="padding-left: 20px;">元</span>
  50. </div>
  51. </el-form-item>
  52. <el-form-item label="审批总金额" v-if="data.drawerTiti=='详情'">
  53. <div style="display: flex;">
  54. <el-input v-model="data.fromData.T_approval_money" disabled style="flex: 1;" /><span style="padding-left: 20px;">元</span>
  55. </div>
  56. </el-form-item>
  57. <el-form-item label="报销明细">
  58. <el-table :data="data.fromData.ReimburseDetails" style="width: 100%">
  59. <el-table-column type="index" label="序号" width="70" />
  60. <el-table-column label="出差地点">
  61. <el-table-column label="起点站" width="150">
  62. <template #default="scope">
  63. <el-input v-model="scope.row.T_trip_origin" placeholder="起点站"
  64. :disabled="data.disabledNum == scope.$index ? false : true" />
  65. </template>
  66. </el-table-column>
  67. <el-table-column prop="city" label="终点站" width="150">
  68. <template #default="scope">
  69. <el-input v-model="scope.row.T_trip_terminus" placeholder="终点站"
  70. :disabled="data.disabledNum == scope.$index ? false : true" />
  71. </template>
  72. </el-table-column>
  73. </el-table-column>
  74. <el-table-column label="出差时间起止时间" width="250">
  75. <template #default="scope">
  76. <el-date-picker v-model="scope.row.mapPick" type="daterange" style="width: 220px;"
  77. @change="changeFun($event, scope)" value-format="YYYY-MM-DD"
  78. :disabled="data.disabledNum == scope.$index ? false : true" />
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="费用类型" width="150">
  82. <template #default="scope">
  83. <el-select v-model.number="scope.row.T_fee_type" class="m-2" placeholder="费用类型" size="large"
  84. :disabled="data.disabledNum == scope.$index ? false : true">
  85. <el-option v-for="item in data.optionsFeeType" :key="item.Id" :label="item.T_name"
  86. @click="clickFeeType(item)" :value="item.Id" />
  87. </el-select>
  88. </template>
  89. </el-table-column>
  90. <el-table-column label="费用明细" width="150">
  91. <template #default="scope">
  92. <el-select v-model.number="scope.row.T_fee_details" class="m-2" placeholder="费用明细" size="large"
  93. :disabled="data.disabledNum == scope.$index ? false : true">
  94. <el-option v-for="item in scope.row.selectData" :key="item.Id" :label="item.T_name"
  95. :value="item.Id" />
  96. </el-select>
  97. </template>
  98. </el-table-column>
  99. <el-table-column label="费用金额" width="150">
  100. <template #default="scope">
  101. <el-input v-model.number="scope.row.T_money" placeholder="费用金额"
  102. :disabled="data.disabledNum == scope.$index ? false : true" />
  103. </template>
  104. </el-table-column>
  105. <el-table-column label="审批金额" width="100">
  106. <template #default="scope">
  107. <el-input v-model="scope.row.T_approval_money" :disabled="data.drawerTiti=='详情'?true:false" placeholder="审批金额" />
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="费用事由" width="150">
  111. <template #default="scope">
  112. <el-input v-model="scope.row.T_reasons" placeholder="费用事由"
  113. :disabled="data.disabledNum == scope.$index ? false : true" />
  114. </template>
  115. </el-table-column>
  116. <el-table-column label="涉及项目" width="150" :show-overflow-tooltip="true">
  117. <template #default="scope">
  118. <div v-if="data.drawerTiti == '详情'" style="width: 130px;overflow-x: hidden;">
  119. {{ scope.row.T_project }}
  120. </div>
  121. <el-input v-else v-model="scope.row.T_project" placeholder="涉及项目"
  122. :disabled="data.disabledNum == scope.$index ? false : true" />
  123. </template>
  124. </el-table-column>
  125. <el-table-column label="附件" :min-width="data.drawerTiti != '详情' ? '80' : ''">
  126. <template #default="scope">
  127. <upImg v-model:upImg="scope.row.T_img" :imgData="scope.row.T_img" :disabled="data.drawerTiti=='详情'?true:false"></upImg>
  128. </template>
  129. </el-table-column>
  130. <el-table-column fixed="right" min-width="300" v-if="data.drawerTiti != '详情'">
  131. <template #default="scope">
  132. <el-button type="primary" @click="EditFun(scope)">修改</el-button>
  133. <el-button @click="newDel(scope)">删除</el-button>
  134. </template>
  135. </el-table-column>
  136. </el-table>
  137. <div class="newMingxi" @click="newAdd" v-if="data.drawerTiti != '详情'">
  138. <el-icon color="#409EFC" class="no-inherit">
  139. <Plus />
  140. </el-icon>
  141. <span style="padding-left: 5px;">新增明细</span>
  142. </div>
  143. </el-form-item>
  144. <el-form-item label="打款明细" v-if="data.drawerTiti == '详情'">
  145. <el-table :data="data.tableRemit" :header-cell-style="{ background: '#f5f7fa' }" border>
  146. <el-table-column type="index" label="序号" fixed width="70" />
  147. <el-table-column prop="T_time" label="打款时间" width="300" />
  148. <el-table-column prop="T_money" label="打款金额" />
  149. </el-table>
  150. </el-form-item>
  151. </el-form>
  152. <div class="demo-drawer__footer">
  153. <el-button type="primary" @click="subData" v-if="data.drawerTiti != '详情'">立即提交</el-button>
  154. <el-button @click="data.drawer = false">取消</el-button>
  155. </div>
  156. </el-drawer>
  157. <el-dialog v-model="dialogVisible" :draggable="true" style="width: 500px;max-height: 700px;">
  158. <img :src="dialogImageUrl" style="width: 100%;height: auto;object-fit: contain;" />
  159. </el-dialog>
  160. </div>
  161. </template>
  162. <script setup lang="ts">
  163. import {
  164. ReimburseMy_List, ReimburseMy_Del, ReimburseMy_Add,ReimburseMy_Edit, ReimburseMy_Get,
  165. ReimburseMy_FeeType,ReimburseMy_Submit
  166. } from '@/api/ReimburseMy/index'
  167. import { computed, reactive, ref,watch } from "vue";
  168. import { ElMessage, ElMessageBox } from 'element-plus'
  169. const dialogImageUrl = ref('')
  170. const dialogVisible = ref(false)
  171. import { GlobalStore } from '@/stores/index'
  172. import upImg from '@/components/upImg/upimg.vue'
  173. // import dataList from '@/plugins/reimbursemyData.js'
  174. const data = reactive({
  175. //费用类型
  176. optionsFeeType: [{ Id: '', T_name: '',FeeDetails:[]}],
  177. pages: {
  178. page: 1,
  179. page_z: 10
  180. },
  181. fileList: [],
  182. total: 0,//列表总页码
  183. disabledNum: 0,
  184. pickerdATA: [],
  185. drawer: false,
  186. drawerTiti: '',
  187. tableData: [],
  188. tableRemit:[],//打款明细
  189. fromData: {//新增,编辑的提交参数
  190. User_tokey: GlobalStore().GET_User_tokey,
  191. T_money: 0,
  192. T_id:'',
  193. T_approval_money:'',
  194. ReimburseDetails:[{
  195. mapPick: [],
  196. selectData:[],
  197. T_approval_money:"",
  198. T_trip_start_time: "",
  199. T_trip_end_time: "",
  200. T_trip_origin: "",
  201. T_trip_terminus: "",
  202. T_fee_type: null,
  203. T_fee_details: null,
  204. T_money: 0,
  205. T_reasons: "",
  206. T_project: "",
  207. T_img: ""
  208. },]
  209. }
  210. })
  211. const T_money = computed(()=>{
  212. const arr = data.fromData.ReimburseDetails
  213. const arrMoney:any = []
  214. arr.forEach(item => {
  215. arrMoney.push(item.T_money)
  216. });
  217. // const sun =
  218. data.fromData.T_money = arrMoney.reduce((n:any,m:any) => n + m)
  219. console.log('计算属性',data.fromData.T_money)
  220. return arrMoney.reduce((n:any,m:any) => n + m)
  221. })
  222. const uploadRef = ref()
  223. const changeFun = (timeKey: any, e: any) => {
  224. data.fromData.ReimburseDetails[e.$index].T_trip_start_time = timeKey[0]
  225. data.fromData.ReimburseDetails[e.$index].T_trip_end_time = timeKey[1]
  226. }
  227. const ReimburseMyListApi = async () => {
  228. const res: any = await ReimburseMy_List(data.pages)
  229. data.tableData = res.Data.Data
  230. data.total = res.Data.Num
  231. }
  232. ReimburseMyListApi()
  233. const handleRemove = (r: any) => {
  234. console.log('删除', r)
  235. }
  236. const handlePictureCardPreview = (uploadFile: any) => {
  237. console.log('查看', uploadFile)
  238. dialogImageUrl.value = uploadFile.url!
  239. dialogVisible.value = true
  240. }
  241. //点击编辑/新增得确定按钮
  242. const subData = () => {
  243. console.log('编辑',data.fromData)
  244. // return
  245. if (data.drawerTiti == '新增') {
  246. setAddApi()
  247. } else {
  248. seteditApi()
  249. }
  250. }
  251. //编辑
  252. const seteditApi = async()=>{
  253. console.log('编辑',data.fromData)
  254. const resIt: any = await ReimburseMy_Edit(data.fromData)
  255. console.log('编辑', resIt)
  256. if (resIt.Code == 200) {
  257. ElMessage.success('编辑报销数据成功')
  258. data.drawer = false
  259. ReimburseMyListApi()
  260. }
  261. }
  262. //新增api
  263. const setAddApi = async () => {
  264. const resIt: any = await ReimburseMy_Add(data.fromData)
  265. console.log('新增返回', resIt)
  266. if (resIt.Code == 200) {
  267. ElMessage.success('新增成功')
  268. data.drawer = false
  269. ReimburseMyListApi()
  270. }
  271. }
  272. //费用类型列表api
  273. const FeeTypeApi = async () => {
  274. const resIt: any = await ReimburseMy_FeeType({})
  275. console.log('费用类型', resIt)
  276. if (resIt.Code == 200) {
  277. data.optionsFeeType = resIt.Data
  278. }
  279. }
  280. const clickFeeType = (data:any) => {
  281. console.log('点击',data)
  282. // data.fromData.ReimburseDetails[data.disabledNum].T_fee_details = null
  283. }
  284. watch(() => data.fromData, (newvalue,oldvalue) => {
  285. const arr = data.fromData.ReimburseDetails
  286. for (let index = 0; index < arr.length; index++) {
  287. if (arr[index].T_fee_type) {
  288. let select:any = (data.optionsFeeType.find(item => item.Id == arr[index].T_fee_type))?.FeeDetails ?? [{ Id: "", T_name: "" }]
  289. data.fromData.ReimburseDetails[index].selectData = select
  290. } else {
  291. return []
  292. }
  293. }
  294. },{ deep: true}
  295. );
  296. //删除报销列表
  297. const delReimbu = (data: any) => {
  298. console.log('删除', data)
  299. ElMessageBox.confirm('删除报销,是否继续?', '提示', {
  300. confirmButtonText: 'OK',
  301. cancelButtonText: 'Cancel',
  302. type: 'warning',
  303. center: true,
  304. }).then(async () => {
  305. const res: any = await ReimburseMy_Del({ T_id: data.Id })
  306. console.log('返回', res)
  307. if (res.Code == 200) {
  308. ElMessage.success('已删除报销')
  309. ReimburseMyListApi()
  310. }
  311. }).catch(() => {
  312. ElMessage.info('已取消删除报销')
  313. })
  314. }
  315. //分页
  316. const handleCurrentChange = (val: number) => {
  317. data.pages.page = val
  318. ReimburseMyListApi()
  319. }
  320. //显示弹窗
  321. const showDrawer = (e: string, datas: any) => {
  322. let id
  323. if (datas) id = datas.Id
  324. switch (e) {
  325. case 'news':
  326. FeeTypeApi()//获取费用类型
  327. data.drawer = true
  328. data.drawerTiti = '新增'
  329. data.fromData = {
  330. User_tokey: GlobalStore().GET_User_tokey,
  331. T_id:'',
  332. T_money: 0,
  333. T_approval_money:'',
  334. ReimburseDetails: [{
  335. mapPick: [],
  336. selectData:[],
  337. T_approval_money:"",
  338. T_trip_start_time: "",
  339. T_trip_end_time: "",
  340. T_trip_origin: "",
  341. T_trip_terminus: "",
  342. T_fee_type: null,
  343. T_fee_details: null,
  344. T_money: 0,
  345. T_reasons: "",
  346. T_project: "",
  347. T_img: ""
  348. }]
  349. }
  350. data.disabledNum = 0
  351. break;
  352. case 'det':
  353. FeeTypeApi()//获取费用类型
  354. data.drawer = true
  355. data.drawerTiti = '详情'
  356. console.log('datas', datas,e)
  357. GetdetAPi(id)
  358. data.disabledNum = -1
  359. // data.fromData.ReimburseDetails = [...data.fromData.ReimburseDetails,...dataList]
  360. break;
  361. case 'edi':
  362. FeeTypeApi()//获取费用类型
  363. data.drawer = true
  364. data.drawerTiti = '编辑'
  365. data.disabledNum = 0
  366. GetdetAPi(id)
  367. data.fromData.T_id = id
  368. // data.fromData.ReimburseDetails = [...data.fromData.ReimburseDetails,...dataList]
  369. break;
  370. default:
  371. console.log('提交审核')
  372. SubmitApi(id)
  373. break;
  374. }
  375. }
  376. //提交审核api
  377. const SubmitApi = async(Id:any)=>{
  378. const resIt: any = await ReimburseMy_Submit({ T_id: Id })
  379. console.log('获取详情',resIt)
  380. if (resIt.Code == 200) {
  381. ElMessage.success('ok,提交成功')
  382. ReimburseMyListApi()
  383. }
  384. }
  385. //获取详情Api
  386. const GetdetAPi = async (Id: any) => {
  387. const resIt: any = await ReimburseMy_Get({ T_id: Id })
  388. console.log('获取详情',resIt)
  389. if (resIt.Code == 200) {
  390. const arr = resIt.Data.T_reimburse_details
  391. data.tableRemit = resIt.Data.T_remit_detail
  392. data.fromData.T_money = resIt.Data.T_money
  393. data.fromData.T_approval_money = resIt.Data.T_approval_money
  394. data.fromData.ReimburseDetails = []
  395. console.log('datas',uploadRef.value)
  396. arr.forEach((item: any) => {
  397. item.mapPick = [item.T_trip_start_time, item.T_trip_end_time]
  398. })
  399. data.fromData.ReimburseDetails = arr
  400. }
  401. }
  402. //关闭弹窗
  403. const handleClose = () => {
  404. data.drawer = false
  405. }
  406. //点击了编辑
  407. const EditFun = (e: any) => {
  408. data.disabledNum = e.$index
  409. }
  410. //添加任务
  411. const newAdd = () => {
  412. data.fromData.ReimburseDetails.push({
  413. mapPick: [],
  414. selectData:[],
  415. T_approval_money:"",
  416. T_trip_start_time: "",
  417. T_trip_end_time: "",
  418. T_trip_origin: "",
  419. T_trip_terminus: "",
  420. T_fee_type: null,
  421. T_fee_details: null,
  422. T_money: 0,
  423. T_reasons: "",
  424. T_project: "",
  425. T_img: ""
  426. })
  427. data.disabledNum = data.fromData.ReimburseDetails.length - 1
  428. }
  429. //删除任务
  430. const newDel = (e: any) => {
  431. data.fromData.ReimburseDetails.splice(e.$index, 1)
  432. console.log('e', data.fromData.ReimburseDetails)
  433. }
  434. </script>
  435. <style lang="scss">
  436. // to fix el-message弹框被el-dialog覆盖的问题。
  437. .el-message {
  438. z-index: 99999999 !important;
  439. }
  440. .newMingxi {
  441. display: flex;
  442. align-items: center;
  443. border-bottom: 1px solid #409EFC;
  444. cursor: pointer;
  445. line-height: 0;
  446. padding: 10px 0 2px 0;
  447. color: #409EFC;
  448. user-select: none;
  449. }
  450. .reimburseMy {
  451. &-table {
  452. padding: 20px;
  453. background: #fff;
  454. border: 1px solid var(--el-card-border-color);
  455. box-shadow: var(--el-box-shadow-light);
  456. border-radius: 5px;
  457. }
  458. }
  459. // 上传图片框样式
  460. .el-upload--picture-card {
  461. width: 50px;
  462. height: 50px;
  463. font-size: 16px !important;
  464. }
  465. .el-upload {
  466. width: 50px;
  467. height: 50px;
  468. line-height: 50px;
  469. font-size: 16px;
  470. }
  471. .el-upload-list--picture-card .el-upload-list__item {
  472. width: 50px;
  473. height: 50px;
  474. line-height: 50px;
  475. font-size: 16px;
  476. }
  477. .el-upload-list--picture-card .el-upload-list__item-actions:hover {
  478. opacity: 1;
  479. font-size: 16px;
  480. }
  481. .el-upload-list--picture-card .el-upload-list__item-thumbnail {
  482. width: 50px;
  483. height: 50px;
  484. line-height: 50px;
  485. font-size: 16px;
  486. }
  487. </style>