index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
  4. <el-form-item label="汇总月份" prop="summaryMonthRange">
  5. <el-date-picker
  6. v-model="summaryMonthRange"
  7. type="monthrange"
  8. range-separator="-"
  9. format="YYYY.MM"
  10. value-format="YYYY.MM"
  11. start-placeholder="开始月份"
  12. end-placeholder="结束月份"
  13. clearable
  14. @change="handleQuery">
  15. </el-date-picker>
  16. </el-form-item>
  17. <el-form-item label="供应商名称" prop="deptName">
  18. <el-input
  19. v-model="queryParams.deptName"
  20. placeholder="请输入供应商名称"
  21. clearable
  22. @keyup.enter="handleQuery"
  23. />
  24. </el-form-item>
  25. <el-form-item label="账单状态" prop="status">
  26. <el-select v-model="queryParams.status" placeholder="请选择">
  27. <el-option
  28. v-for="item in monthly_report_status"
  29. :key="item.value"
  30. :label="item.label"
  31. :value="item.value">
  32. </el-option>
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item>
  36. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  37. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  38. </el-form-item>
  39. </el-form>
  40. <el-row :gutter="10" class="mb8">
  41. <!-- <el-col :span="1.5">-->
  42. <!-- <el-button-->
  43. <!-- type="primary"-->
  44. <!-- plain-->
  45. <!-- icon="Plus"-->
  46. <!-- @click="handleAdd"-->
  47. <!-- v-hasPermi="['system:monthSummary:add']"-->
  48. <!-- >新增</el-button>-->
  49. <!-- </el-col>-->
  50. <!-- <el-col :span="1.5">-->
  51. <!-- <el-button-->
  52. <!-- type="success"-->
  53. <!-- plain-->
  54. <!-- icon="Edit"-->
  55. <!-- :disabled="single"-->
  56. <!-- @click="handleUpdate"-->
  57. <!-- v-hasPermi="['system:monthSummary:edit']"-->
  58. <!-- >修改</el-button>-->
  59. <!-- </el-col>-->
  60. <!-- <el-col :span="1.5">-->
  61. <!-- <el-button-->
  62. <!-- type="danger"-->
  63. <!-- plain-->
  64. <!-- icon="Delete"-->
  65. <!-- :disabled="multiple"-->
  66. <!-- @click="handleDelete"-->
  67. <!-- v-hasPermi="['system:monthSummary:remove']"-->
  68. <!-- >删除</el-button>-->
  69. <!-- </el-col>-->
  70. <el-col :span="1.5">
  71. <el-button
  72. type="warning"
  73. plain
  74. icon="Download"
  75. @click="handleExport"
  76. v-hasPermi="['system:monthSummary:export']"
  77. >导出</el-button>
  78. </el-col>
  79. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  80. </el-row>
  81. <el-table v-loading="loading" :data="monthSummaryList">
  82. <!-- <el-table-column type="selection" width="55" align="center" />-->
  83. <!-- <el-table-column label="月度汇总id" align="center" prop="summaryId" width="90" />-->
  84. <el-table-column label="汇总月份" align="center" >
  85. <template #default="scope">
  86. <el-button
  87. type="text"
  88. @click="detailClick(scope.row)"
  89. v-if="auth.hasPermi('system:costDetails:list')"
  90. v-hasPermi="['system:costDetails:list']"
  91. >{{scope.row.summaryMonth}}</el-button>
  92. <span v-else>{{scope.row.summaryMonth}}</span>
  93. </template>
  94. </el-table-column>
  95. <el-table-column label="应付金额" align="center" prop="payableAmount" />
  96. <el-table-column label="交易笔数" align="center" prop="transactionCount" />
  97. <el-table-column label="账单状态" align="center" prop="status" width="120px" >
  98. <template #default="scope">
  99. <dict-tag :options="monthly_report_status" :value="scope.row.status" />
  100. </template>
  101. </el-table-column>
  102. <el-table-column label="供应商" align="center" prop="deptName" />
  103. <!-- <el-table-column label="用户id" align="center" prop="userId" />-->
  104. <!-- <el-table-column label="百旺开票单据编号" align="center" prop="bwDjbh" />-->
  105. <!-- <el-table-column label="电子发票pdf地址" align="center" prop="bwDzfpPdfUrl" />-->
  106. <!-- <el-table-column label="电子发票ofd地址" align="center" prop="bwDzfpOfdUrl" />-->
  107. <!-- <el-table-column label="电子发票xml地址" align="center" prop="bwDzfpXmlUrl" />-->
  108. <el-table-column label="备注" align="center" prop="remark" />
  109. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="140">
  110. <template #default="scope">
  111. <el-button
  112. type="text"
  113. @click="detailClick(scope.row)"
  114. v-hasPermi="['system:costDetails:list']"
  115. v-if="scope.row.status == 1"
  116. >调账</el-button>
  117. <el-button
  118. type="text"
  119. @click="detailClick(scope.row)"
  120. v-hasPermi="['system:costDetails:list']"
  121. v-if="scope.row.status == 2"
  122. >查看</el-button>
  123. <el-button link type="primary" @click="handleDuizhang(scope.row)" :disabled="scope.row.status != 1">对账</el-button>
  124. <el-button link type="primary" @click="handleKaipiao(scope.row)" :disabled="scope.row.status != 2">开票</el-button>
  125. <!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:monthSummary:remove']">删除</el-button>-->
  126. </template>
  127. </el-table-column>
  128. </el-table>
  129. <pagination
  130. v-show="total>0"
  131. :total="total"
  132. v-model:page="queryParams.pageNum"
  133. v-model:limit="queryParams.pageSize"
  134. @pagination="getList"
  135. />
  136. <!-- 添加或修改财务月度汇总对话框 -->
  137. <el-dialog title="title" v-model="open" width="70%" append-to-body>
  138. <el-form ref="monthSummaryRef" :model="form" :rules="rules" :inline="true" label-width="160px">
  139. <el-form-item label="汇总月份" prop="summaryMonth">
  140. <el-date-picker
  141. v-model="form.summaryMonth"
  142. type="month"
  143. placeholder="选择月"
  144. clearable
  145. value-format="yyyy-MM">
  146. </el-date-picker>
  147. </el-form-item>
  148. <el-form-item label="应付金额" prop="payableAmount">
  149. <el-input v-model="form.payableAmount" placeholder="请输入应付金额" />
  150. </el-form-item>
  151. <el-form-item label="交易笔数" prop="transactionCount">
  152. <el-input v-model="form.transactionCount" placeholder="请输入交易笔数" />
  153. </el-form-item>
  154. <el-form-item label="账单状态" prop="status">
  155. <el-select v-model="form.status" placeholder="请选择">
  156. <el-option
  157. v-for="item in monthly_report_status"
  158. :key="item.value"
  159. :label="item.label"
  160. :value="item.value">
  161. </el-option>
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item label="供应商名称" prop="deptId">
  165. <el-input v-model="form.deptId" placeholder="请输入部门ID" />
  166. </el-form-item>
  167. <el-form-item label="用户id" prop="userId">
  168. <el-input v-model="form.userId" placeholder="请输入用户id" />
  169. </el-form-item>
  170. <el-form-item label="百旺开票单据编号" prop="bwDjbh">
  171. <el-input v-model="form.bwDjbh" placeholder="请输入百旺开票单据编号" />
  172. </el-form-item>
  173. <el-form-item label="电子发票pdf地址" prop="bwDzfpPdfUrl">
  174. <el-input v-model="form.bwDzfpPdfUrl" placeholder="请输入电子发票pdf地址" />
  175. </el-form-item>
  176. <el-form-item label="电子发票ofd地址" prop="bwDzfpOfdUrl">
  177. <el-input v-model="form.bwDzfpOfdUrl" placeholder="请输入电子发票ofd地址" />
  178. </el-form-item>
  179. <el-form-item label="电子发票xml地址" prop="bwDzfpXmlUrl">
  180. <el-input v-model="form.bwDzfpXmlUrl" placeholder="请输入电子发票xml地址" />
  181. </el-form-item>
  182. <el-form-item label="备注" prop="remark">
  183. <el-input v-model="form.remark" placeholder="请输入备注" />
  184. </el-form-item>
  185. </el-form>
  186. <template #footer>
  187. <div class="dialog-footer">
  188. <el-button type="primary" @click="submitForm">确 定</el-button>
  189. <el-button @click="cancel">取 消</el-button>
  190. </div>
  191. </template>
  192. </el-dialog>
  193. <el-dialog title="对账" v-model="openDuizhang" width="40%" append-to-body>
  194. <div class="info">
  195. <div>
  196. <span class="label">已勾选运单:</span>
  197. <span class="label">共<span class="font-red">{{form.transactionCount}}</span>票</span>
  198. </div>
  199. <div>
  200. <span class="label">账单费用:</span>
  201. <span class="label">应付金额<span class="font-red">{{form.payableAmount}}</span>元</span>
  202. </div>
  203. <div>
  204. <span class="label">注意:对账一经完成,无法修改,请谨慎操作。</span>
  205. </div>
  206. </div>
  207. <template #footer>
  208. <div class="dialog-footer">
  209. <el-button type="danger" @click="submitFormDZ">确 认</el-button>
  210. <el-button @click="openDuizhang = false">取 消</el-button>
  211. </div>
  212. </template>
  213. </el-dialog>
  214. <!-- 开票 -->
  215. <el-dialog title="申请开票" v-model="openKaipiao" width="70%" append-to-body>
  216. <el-form ref="formKPRef" :model="formKP" :rules="rulesKP" label-width="160px">
  217. <el-row>
  218. <el-col :span="24">
  219. <el-form-item label="开票金额共:" prop="BigDecimal">
  220. <div class="font-red">{{formKP.BigDecimal}}</div>
  221. </el-form-item>
  222. </el-col>
  223. <el-col :span="12">
  224. <el-form-item label="发票抬头" prop="invoiceName">
  225. <el-input v-model="formKP.invoiceName" placeholder="请填写发票抬头" disabled />
  226. </el-form-item>
  227. </el-col>
  228. <el-col :span="12">
  229. <el-form-item label="纳税人识别号" prop="invoiceNum">
  230. <el-input v-model="formKP.invoiceNum" placeholder="请填写购买方纳税人识别号" disabled />
  231. </el-form-item>
  232. </el-col>
  233. <el-col :span="12">
  234. <el-form-item label="收票人邮箱" prop="email">
  235. <el-input v-model="formKP.email" placeholder="请填写收票人邮箱" />
  236. </el-form-item>
  237. </el-col>
  238. <el-col :span="12">
  239. <el-form-item label="地址" prop="companyAddress">
  240. <el-input v-model="formKP.companyAddress" placeholder="请填写准确的地址" />
  241. </el-form-item>
  242. </el-col>
  243. <el-col :span="12">
  244. <el-form-item label="电话" prop="phone">
  245. <el-input v-model="formKP.phone" placeholder="请填写7位或以上的电话号码" />
  246. </el-form-item>
  247. </el-col>
  248. <el-col :span="12">
  249. <el-form-item label="开户银行" prop="openBank">
  250. <el-input v-model="formKP.openBank" placeholder="请填写购买方开户行" />
  251. </el-form-item>
  252. </el-col>
  253. <el-col :span="12">
  254. <el-form-item label="银行账号" prop="bankAccount">
  255. <el-input v-model="formKP.bankAccount" placeholder="请填写购买方银行账号" />
  256. </el-form-item>
  257. </el-col>
  258. <el-col :span="12">
  259. <el-form-item label="备注说明" prop="remark">
  260. <el-input v-model="formKP.remark" placeholder="请填写需要在发票备注栏中显示的内容" />
  261. </el-form-item>
  262. </el-col>
  263. </el-row>
  264. </el-form>
  265. <template #footer>
  266. <div class="dialog-footer">
  267. <el-button type="primary" @click="submitFormKP">确 定</el-button>
  268. <el-button @click="openKaipiao = false">取 消</el-button>
  269. </div>
  270. </template>
  271. </el-dialog>
  272. </div>
  273. </template>
  274. <script setup name="MonthSummary">
  275. import { listMonthSummary, getMonthSummary, delMonthSummary, addMonthSummary, updateMonthSummary,invoiceIssuance } from "@/api/logistics/monthSummary"
  276. import { getDept } from "@/api/system/dept"
  277. import auth from '@/plugins/auth'
  278. const { proxy } = getCurrentInstance()
  279. const { monthly_report_status } = proxy.useDict("monthly_report_status")
  280. const { jd_logistics_product_code } = proxy.useDict("jd_logistics_product_code")
  281. const { sf_logistics_product_code } = proxy.useDict("sf_logistics_product_code")
  282. const monthSummaryList = ref([])
  283. const open = ref(false)
  284. const loading = ref(true)
  285. const showSearch = ref(true)
  286. const ids = ref([])
  287. const single = ref(true)
  288. const multiple = ref(true)
  289. const total = ref(0)
  290. const title = ref("")
  291. const router = useRouter()
  292. const data = reactive({
  293. form: {},
  294. queryParams: {
  295. pageNum: 1,
  296. pageSize: 10,
  297. summaryMonth: null,
  298. payableAmount: null,
  299. transactionCount: null,
  300. status: null,
  301. deptId: null,
  302. userId: null,
  303. bwDjbh: null,
  304. bwDzfpPdfUrl: null,
  305. bwDzfpOfdUrl: null,
  306. bwDzfpXmlUrl: null,
  307. },
  308. monthly_report_status:[],
  309. rules: {
  310. payableAmount: [
  311. {
  312. pattern: /^\d+(\.\d{1,2})?$/,
  313. message: "应付金额必须为数字,且最多保留两位小数",
  314. trigger: "blur"
  315. }
  316. ],
  317. transactionCount: [
  318. {
  319. pattern: /^[1-9]\d*$/,
  320. message: "交易笔数必须为正整数",
  321. trigger: "blur"
  322. }
  323. ]
  324. }
  325. })
  326. const { queryParams, form, rules } = toRefs(data)
  327. const openDuizhang = ref(false);
  328. const summaryMonthRange = ref([]);
  329. const openKaipiao = ref(false);
  330. const formKP = reactive({
  331. invoiceName: '',
  332. invoiceNum: '',
  333. email: '',
  334. companyAddress: '',
  335. phone: '',
  336. openBank: '',
  337. bankAccount: '',
  338. remark: '',
  339. BigDecimal: 0
  340. });
  341. const rulesKP = {
  342. invoiceName: [
  343. { required: true, message: '请填写发票抬头', trigger: 'blur' },
  344. ],
  345. }
  346. const formKPRef = ref(null)
  347. /** 查询财务月度汇总列表 */
  348. function getList() {
  349. loading.value = true
  350. listMonthSummary(queryParams.value).then(response => {
  351. monthSummaryList.value = response.rows
  352. total.value = response.total
  353. loading.value = false
  354. })
  355. }
  356. // 取消按钮
  357. function cancel() {
  358. open.value = false
  359. reset()
  360. }
  361. // 表单重置
  362. function reset() {
  363. form.value = {
  364. summaryId: null,
  365. summaryMonth: null,
  366. payableAmount: null,
  367. transactionCount: null,
  368. status: null,
  369. createTime: null,
  370. updateTime: null,
  371. remark: null,
  372. delFlag: null,
  373. createBy: null,
  374. updateBy: null,
  375. deptId: null,
  376. userId: null,
  377. bwDjbh: null,
  378. bwDzfpPdfUrl: null,
  379. bwDzfpOfdUrl: null,
  380. bwDzfpXmlUrl: null
  381. }
  382. proxy.resetForm("monthSummaryRef")
  383. }
  384. /** 搜索按钮操作 */
  385. function handleQuery() {
  386. queryParams.value.pageNum = 1;
  387. if(summaryMonthRange.value!=null && summaryMonthRange.value.length > 0){
  388. queryParams.value.summaryMonth = summaryMonthRange.value[0];
  389. queryParams.value.summaryMonthEnd = summaryMonthRange.value[1];
  390. }else{
  391. queryParams.value.summaryMonth = null;
  392. queryParams.value.summaryMonthEnd = null;
  393. }
  394. getList()
  395. }
  396. /** 重置按钮操作 */
  397. function resetQuery() {
  398. summaryMonthRange.value =[];
  399. proxy.resetForm("queryRef")
  400. setDefaultMonthRange();
  401. handleQuery()
  402. }
  403. // 多选框选中数据
  404. function handleSelectionChange(selection) {
  405. ids.value = selection.map(item => item.summaryId)
  406. single.value = selection.length != 1
  407. multiple.value = !selection.length
  408. }
  409. /** 新增按钮操作 */
  410. function handleAdd() {
  411. reset()
  412. open.value = true
  413. title.value = "添加财务月度汇总"
  414. }
  415. /** 修改按钮操作 */
  416. function handleUpdate(row) {
  417. reset()
  418. const _summaryId = row.summaryId || ids.value
  419. getMonthSummary(_summaryId).then(response => {
  420. form.value = response.data
  421. open.value = true
  422. title.value = "修改财务月度汇总"
  423. })
  424. }
  425. /** 提交按钮 */
  426. function submitForm() {
  427. proxy.$refs["monthSummaryRef"].validate(valid => {
  428. if (valid) {
  429. if (form.value.summaryId != null) {
  430. updateMonthSummary(form.value).then(response => {
  431. proxy.$modal.msgSuccess("修改成功")
  432. open.value = false
  433. getList()
  434. })
  435. } else {
  436. addMonthSummary(form.value).then(response => {
  437. proxy.$modal.msgSuccess("新增成功")
  438. open.value = false
  439. getList()
  440. })
  441. }
  442. }
  443. })
  444. }
  445. /** 删除按钮操作 */
  446. function handleDelete(row) {
  447. const _summaryIds = row.summaryId || ids.value
  448. proxy.$modal.confirm('是否确认删除财务月度汇总编号为"' + _summaryIds + '"的数据项?').then(function() {
  449. return delMonthSummary(_summaryIds)
  450. }).then(() => {
  451. getList()
  452. proxy.$modal.msgSuccess("删除成功")
  453. }).catch(() => {})
  454. }
  455. // 点击对账
  456. function handleDuizhang(row){
  457. form.value = row;
  458. openDuizhang.value = true;
  459. }
  460. // 对账确认
  461. function submitFormDZ(){
  462. let obj = {
  463. summaryId:form.value.summaryId,
  464. status:2
  465. }
  466. updateMonthSummary(obj).then(response => {
  467. proxy.$modal.msgSuccess("修改成功")
  468. openDuizhang.value = false
  469. getList()
  470. })
  471. }
  472. // 点击开票
  473. function handleKaipiao(row){
  474. getDept(row.deptId).then(response => {
  475. proxy.$nextTick(() => {
  476. Object.assign(formKP, {
  477. invoiceName: response.data.invoiceName || '',
  478. invoiceNum: response.data.invoiceNum || '',
  479. email: response.data.email || '',
  480. companyAddress: response.data.companyAddress || '',
  481. phone: response.data.phone || '',
  482. openBank: response.data.openBank || '',
  483. bankAccount: response.data.bankAccount || '',
  484. remark: response.data.remark || '',
  485. BigDecimal: row.payableAmount || 0
  486. });
  487. openKaipiao.value = true;
  488. });
  489. }).catch(error => {
  490. console.error('获取部门信息失败:', error);
  491. proxy.$modal.msgError('获取开票信息失败');
  492. });
  493. }
  494. function submitFormKP(){
  495. let obj = {
  496. khmc:formKP.invoiceName,
  497. khsh:formKP.invoiceNum,
  498. hsje:formKP.BigDecimal,
  499. khdzdh:`${formKP.companyAddress} ${formKP.phone}`,
  500. khyhzh:`${formKP.openBank} ${formKP.bankAccount}`,
  501. gmfMobile:`${formKP.phone}`,
  502. gmfEmail:`${formKP.email}`,
  503. bz:`${formKP.remark}`,
  504. }
  505. invoiceIssuance(obj).then(response => {
  506. proxy.$modal.msgSuccess("开票申请成功");
  507. openKaipiao.value = false;
  508. })
  509. }
  510. /** 导出按钮操作 */
  511. function handleExport() {
  512. proxy.download('system/monthSummary/export', {
  513. ...queryParams.value
  514. }, `monthSummary_${new Date().getTime()}.xlsx`)
  515. }
  516. // 点击月份查看
  517. function detailClick(row){
  518. router.push({
  519. path:'/money/costList',
  520. query:{
  521. summaryMonth:row.summaryMonth,
  522. deptId:row.deptId,
  523. status:row.status
  524. }
  525. })
  526. }
  527. // 计算上个月的日期范围
  528. const setDefaultMonthRange = () => {
  529. const today = new Date();
  530. const currentYear = today.getFullYear();
  531. const currentMonth = today.getMonth() + 1; // 月份从0开始,所以要+1
  532. // 计算上个月
  533. let lastMonth = currentMonth - 1;
  534. let lastYear = currentYear;
  535. if (lastMonth === 0) {
  536. lastMonth = 12;
  537. lastYear = currentYear - 1;
  538. }
  539. // 格式化为 YYYY.MM
  540. const startDate = `${lastYear}.${String(lastMonth).padStart(2, '0')}`;
  541. const endDate = startDate; // 开始和结束相同,表示只选一个月
  542. summaryMonthRange.value = [startDate, endDate];
  543. // 同时设置查询参数
  544. queryParams.value.summaryMonth = startDate;
  545. queryParams.value.summaryMonthEnd = endDate;
  546. };
  547. setDefaultMonthRange();
  548. getList()
  549. </script>
  550. <style scoped>
  551. .font-red{
  552. color: #E4161F;
  553. }
  554. .info .label{
  555. font-size: 14px;
  556. color: #666;
  557. }
  558. </style>