lsw 10 月之前
父节点
当前提交
6d8c879433

+ 12 - 3
admin-ui/src/views/work/project/index.vue

@@ -59,7 +59,7 @@
       <el-table-column label="操作" align="center" width="370" fixed="right">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-s-goods" @click="op('packages', scope.row)" v-hasPermi="['work:project:list']">接包明细</el-button>
-          <el-button size="mini" type="text" icon="el-icon-document-copy" @click="op('generate', scope.row)" v-hasPermi="['work:statement:make']">生成结算单</el-button>
+          <el-button size="mini" type="text" icon="el-icon-document-copy" @click="op('generate', scope.row)" v-hasPermi="['work:statement:make']" v-if="scope.row.peoples>0">生成结算单</el-button>
           <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:project:list']">详情</el-button>
           <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:project:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:project:remove']">删除</el-button>
@@ -153,8 +153,17 @@
             });
         }
         if (tag == 'generate') {
-          this.$confirm('是否确认生成结算单!', '警告', { type: 'warning' }).then(() => {
-            this.get({ url: 'work/statement/make/generate/project/' + row.id }).then((response) => {
+          this.$prompt('是否确认生成结算单?', {
+            type: 'warning',
+            showInput: true,
+            inputPlaceholder: '结算批次',
+            inputValidator: (value) => {
+              if (!value) {
+                return '请输入结算批次';
+              }
+            }
+          }).then(({ value }) => {
+            this.ajax({ method: 'post', url: 'work/statement/make/generate/project', data: { id: row.id, batchName: value } }).then((response) => {
               this.$modal.msgSuccess('生成成功');
             });
           });

+ 2 - 2
admin-ui/src/views/work/statement/make/index.vue

@@ -93,10 +93,10 @@
         }
         const id = row.id;
         if (tag == 'detail') {
-          this.iframe({ obj: record, param: { form: row, detail: true }, title: '查看结算单明细', width: '65%', height: '70%' });
+          this.iframe({ obj: record, param: { form: row, detail: true }, title: '查看结算单明细', width: '75%', height: '70%' });
         }
         if (tag == 'edit') {
-          this.iframe({ obj: record, param: { form: row }, title: '编辑结算单', width: '65%', height: '70%' });
+          this.iframe({ obj: record, param: { form: row }, title: '编辑结算单', width: '75%', height: '70%' });
         }
         if (tag == 'generate') {
           this.$confirm('是否确认生成结算单?', '警告', { type: 'warning' }).then(() => {

+ 20 - 17
admin-ui/src/views/work/statement/make/record.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="cmain">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent>
       <el-form-item label="姓名" prop="name">
         <el-input v-model="queryParams.name" placeholder="请输入姓名" @keyup.enter.native="handleQuery" class="inp" clearable />
       </el-form-item>
@@ -18,14 +18,16 @@
     <el-table :data="response.rows" border>
       <el-table-column type="index" label="序号" align="center" width="80" />
       <el-table-column label="姓名" align="center" prop="name" width="90" />
-      <el-table-column label="身份证号" align="center" prop="idCard" />
+      <el-table-column label="身份证号" align="center" prop="idCard" width="170" />
       <el-table-column label="手机号" align="center" prop="phone" width="125" />
       <el-table-column label="支付宝" align="center" prop="alipay" width="125" />
-      <el-table-column label="开户行" align="center" prop="bankName" width="120" />
-      <el-table-column label="银行卡号" align="center" prop="bankAccount" />
-      <el-table-column label="结算金额(元)" align="center" prop="money" width="145">
+      <el-table-column label="开户行" align="center" prop="bankName" width="200" />
+      <el-table-column label="银行卡号" align="center" prop="bankAccount" width="200" />
+      <el-table-column label="结算金额(元)" align="center" prop="money" width="125" />
+      <el-table-column label="操作" align="center" width="160" fixed="right" v-if="!param.detail">
         <template slot-scope="scope">
-          <el-input type="number" v-model="scope.row.money" placeholder="输入金额" @blur="blur(scope.row)" clearable />
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)">编辑</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)">删除</el-button>
         </template>
       </el-table-column>
       <template slot="empty">
@@ -36,13 +38,11 @@
   </div>
 </template>
 <script>
+  import edit from './recordEdit.vue';
   export default {
     data() {
       return {
-        ids: [],
-        showSearch: true,
         response: {},
-        dateRange: [],
         queryParams: {
           pageNum: 1,
           pageSize: 10,
@@ -81,17 +81,20 @@
       },
       resetQuery() {
         this.resetForm('queryForm');
-        this.dateRange = [];
         this.handleQuery();
       },
-      blur(row) {
-        this.ajax({ method: 'post', url: '/work/statement/make/money/edit', data: { id: row.id, money: row.money } }).then((response) => {
-          this.$modal.msgSuccess('编辑成功');
-        });
+      op(tag, row) {
+        if (tag == 'edit') {
+          this.iframe({ obj: edit, param: { form: row }, title: '编辑结算单', width: '35%', height: '55%' });
+        }
       },
-      /** 导出按钮操作 */
-      handleExport() {
-        this.download('/work/recharge/export', { ...this.queryParams }, '充值明细.xlsx');
+      del(row) {
+        this.$confirm('是否确认删除选中数据?', '警告', { type: 'warning' }).then(() => {
+          this.get({ url: '/work/statement/make/statementDetail/remove/' + row.id }).then((response) => {
+            this.$modal.msgSuccess('删除成功');
+            this.getList();
+          });
+        });
       }
     }
   };

+ 78 - 0
admin-ui/src/views/work/statement/make/recordEdit.vue

@@ -0,0 +1,78 @@
+<template>
+  <div class="cmain">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="姓名" prop="name">
+        <el-input v-model="form.name" placeholder="请输入姓名" clearable />
+      </el-form-item>
+      <el-form-item label="身份证号" prop="idCard">
+        <el-input v-model="form.idCard" placeholder="请输入身份证号" clearable />
+      </el-form-item>
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号" clearable />
+      </el-form-item>
+      <el-form-item label="支付宝" prop="alipay">
+        <el-input v-model="form.alipay" placeholder="请输入支付宝" clearable />
+      </el-form-item>
+      <el-form-item label="开户行" prop="bankName">
+        <el-input v-model="form.bankName" placeholder="请输入开户行" clearable />
+      </el-form-item>
+      <el-form-item label="银行卡号" prop="bankAccount">
+        <el-input v-model="form.bankAccount" placeholder="请输入银行卡号" clearable />
+      </el-form-item>
+      <el-form-item label="结算金额(元)" prop="money">
+        <el-input type="number" v-model="form.money" placeholder="请输入结算金额" clearable />
+      </el-form-item>
+    </el-form>
+    <div class="mfooter">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="$layer.close(layerid)">取 消</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    dicts: ['invoice', 'channel'],
+    data() {
+      return {
+        form: {},
+        rules: {
+          name: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          idCard: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          phone: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          alipay: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          bankName: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          bankAccount: [{ required: true, message: '不能为空', trigger: 'blur' }],
+          money: [{ required: true, message: '不能为空', trigger: 'blur' }]
+        }
+      };
+    },
+    props: {
+      param: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      layerid: {
+        type: String
+      }
+    },
+    mounted() {
+      this.form = this.param.form;
+    },
+    methods: {
+      submitForm() {
+        this.$refs['form'].validate((valid) => {
+          if (valid) {
+            this.ajax({ method: 'post', url: '/work/statement/make/statementDetail/edit', data: this.form }).then((response) => {
+              this.$modal.msgSuccess('编辑成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          }
+        });
+      }
+    }
+  };
+</script>

+ 14 - 7
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/StatementController.java

@@ -204,9 +204,9 @@ public class StatementController extends BaseController {
 
     @PreAuthorize("@ss.hasPermi('work:statement:make')")
     @Log(title = "生成结算单(自动)", businessType = BusinessType.UPDATE)
-    @GetMapping("/make/generate/project/{id}")
-    public AjaxResult makeGenerateByProject(@PathVariable("id") Long id) {
-        return statementService.makeGenerateByProject(id);
+    @PostMapping("/make/generate/project")
+    public AjaxResult makeGenerateByProject(@Validated @RequestBody GenerateDto dto) {
+        return statementService.makeGenerateByProject(dto);
     }
 
     @PreAuthorize("@ss.hasAnyPermi('system:user:add,work:statement:give')")
@@ -226,10 +226,17 @@ public class StatementController extends BaseController {
     }
 
     @PreAuthorize("@ss.hasPermi('work:statement:make')")
-    @Log(title = "编辑结算单明细金额", businessType = BusinessType.UPDATE)
-    @PostMapping("/make/money/edit")
-    public AjaxResult makeMoneyEdit(@Validated @RequestBody MoneyDto dto){
-        return statementService.makeMoneyEdit(dto);
+    @Log(title = "编辑结算单明细", businessType = BusinessType.UPDATE)
+    @PostMapping("/make/statementDetail/edit")
+    public AjaxResult makeStatementDetailEdit(@Validated @RequestBody StatementDetail detail) {
+        return statementService.makeStatementDetailEdit(detail);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
+    @Log(title = "删除结算单明细", businessType = BusinessType.DELETE)
+    @GetMapping("/make/statementDetail/remove/{id}")
+    public AjaxResult makeStatementDetailRemove(@PathVariable Long id) {
+        return statementService.makeStatementDetailRemove(id);
     }
 
     @PreAuthorize("@ss.hasPermi('work:statement:make')")

+ 17 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/GenerateDto.java

@@ -0,0 +1,17 @@
+package com.ruoyi.web.work.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class GenerateDto {
+
+
+    @NotNull(message = "参数错误")
+    private Long id;
+
+    @NotBlank(message = "结算批次不能为空")
+    private String batchName;
+}

+ 0 - 19
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/MoneyDto.java

@@ -1,19 +0,0 @@
-package com.ruoyi.web.work.domain.dto;
-
-import lombok.Data;
-
-import javax.validation.constraints.DecimalMin;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
-
-@Data
-public class MoneyDto {
-
-
-    @NotNull(message = "参数错误")
-    private Long id;
-
-    @NotNull(message = "金额不能为空")
-    @DecimalMin(value = "1", inclusive = false, message = "金额不能小于1")
-    private BigDecimal money;
-}

+ 15 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IStatementService.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.Statement;
 import com.ruoyi.web.work.domain.StatementDetail;
-import com.ruoyi.web.work.domain.dto.MoneyDto;
+import com.ruoyi.web.work.domain.dto.GenerateDto;
 import com.ruoyi.web.work.domain.dto.RejectDto;
 import com.ruoyi.web.work.domain.dto.StatementDto;
 import com.ruoyi.web.work.domain.dto.StatementExportDto;
@@ -50,18 +50,19 @@ public interface IStatementService extends IService<Statement> {
     /**
      * 点击项目生成结算单
      *
-     * @param id
+     * @param dto
      * @return
      */
-    AjaxResult makeGenerateByProject(Long id);
+    AjaxResult makeGenerateByProject(GenerateDto dto);
 
 
     /**
-     * 编辑结算单明细金额
-     * @param dto
+     * 编辑结算单明细
+     *
+     * @param detail
      * @return
      */
-    AjaxResult makeMoneyEdit(MoneyDto dto);
+    AjaxResult makeStatementDetailEdit(StatementDetail detail);
 
     /**
      * 提交结算单审核
@@ -129,4 +130,12 @@ public interface IStatementService extends IService<Statement> {
      * @throws ServerException
      */
     AjaxResult payDelete(Long id) throws ServerException;
+
+    /**
+     * 删除结算单明细
+     *
+     * @param id
+     * @return
+     */
+    AjaxResult makeStatementDetailRemove(Long id);
 }

+ 27 - 10
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/StatementServiceImpl.java

@@ -9,7 +9,7 @@ import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanValidators;
 import com.ruoyi.web.work.domain.*;
-import com.ruoyi.web.work.domain.dto.MoneyDto;
+import com.ruoyi.web.work.domain.dto.GenerateDto;
 import com.ruoyi.web.work.domain.dto.RejectDto;
 import com.ruoyi.web.work.domain.dto.StatementDto;
 import com.ruoyi.web.work.domain.dto.StatementExportDto;
@@ -80,7 +80,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
         for (int i = 0; i < list.size(); i++) {
             StatementExportListVo e = list.get(i);
             e.setIndex(i + 1);
-            e.setFlag(e.getBankName().contains("建行")||e.getBankName().contains("建设银行") ? 0 : 1);
+            e.setFlag(e.getBankName().contains("建行") || e.getBankName().contains("建设银行") ? 0 : 1);
             e.setRemarks(dto.getRemarks());
         }
         return list;
@@ -108,6 +108,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
         int successNum = 0;
         for (StatementDetail detail : list) {
             BeanValidators.validateWithException(validator, detail);
+            detail.setBankAccount(detail.getBankAccount().trim());
             detail.setStatementId(statement.getId());
             detail.setProjectId(statement.getProjectId());
             detail.setState(0);
@@ -132,6 +133,11 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
         if (statement.getState() != 0) {
             return AjaxResult.error("不可操作");
         }
+        List<StatementDetail> detailList = detailService.selectList(new StatementDetail().setStatementId(statement.getId()));
+        if (detailList.isEmpty() || detailList.size() == 0) {
+            return AjaxResult.error("结算单发放人数为空");
+        }
+        detailList.forEach(e -> BeanValidators.makeGenerateValidation(validator, e));
         statement.setState(1);
         statement.setNum(StringUtils.generateNumber());
         statement.setGenerateTime(new Date());
@@ -143,8 +149,8 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
 
     @Transactional
     @Override
-    public AjaxResult makeGenerateByProject(Long id) {
-        Project project = projectService.getById(id);
+    public AjaxResult makeGenerateByProject(GenerateDto dto) {
+        Project project = projectService.getById(dto.getId());
         if (project == null || !project.getCompanyId().equals(SecurityUtils.getLoginUser().getUser().getCompanyId())) {
             return AjaxResult.error("项目不存在或非法操作");
         }
@@ -161,6 +167,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
         Platform platform = redisCache.getCacheObject(CacheConstants.APP_PLATFORM);
         Statement statement = new Statement();
         statement.setFileName("自动生成");
+        statement.setBatchName(dto.getBatchName());
         statement.setProjectId(project.getId());
         statement.setChannel("银行卡转账");
         statement.setInvoice("增值税全额发票");
@@ -198,17 +205,15 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
     }
 
     @Override
-    public AjaxResult makeMoneyEdit(MoneyDto dto) {
-        StatementDetail detail = detailService.getById(dto.getId());
+    public AjaxResult makeStatementDetailEdit(StatementDetail detail) {
         if (detail == null || !detail.getCompanyId().equals(SecurityUtils.getLoginUser().getUser().getCompanyId())) {
-            return AjaxResult.error("关联结算单不存在或非法操作");
+            return AjaxResult.error("关联结算单明细不存在或非法操作");
         }
         Platform platform = redisCache.getCacheObject(CacheConstants.APP_PLATFORM);
-        detail.setMoney(dto.getMoney());
         detail.setServiceMoney(platform.getRate().divide(new BigDecimal("100")).multiply(detail.getMoney()));
         detail.setRealMoney(detail.getMoney().subtract(detail.getServiceMoney()));
         if (!detailService.updateById(detail)) {
-            throw new ServiceException("编辑金额失败");
+            throw new ServiceException("编辑结算单明细失败");
         }
         return AjaxResult.success();
     }
@@ -360,10 +365,22 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
     }
 
     @Override
-    public AjaxResult payDelete(Long id) throws ServerException {
+    public AjaxResult payDelete(Long id) {
         if (!removeById(id)) {
             throw new ServiceException("平台删除发放业务费失败,请联系平台");
         }
         return AjaxResult.success();
     }
+
+    @Override
+    public AjaxResult makeStatementDetailRemove(Long id) {
+        StatementDetail detail = detailService.getById(id);
+        if (detail == null || !detail.getCompanyId().equals(SecurityUtils.getLoginUser().getUser().getCompanyId())) {
+            return AjaxResult.error("结算单明细不存在或非法操作");
+        }
+        if (!detailService.removeById(id)) {
+            throw new ServiceException("删除结算单明细失败,请联系平台");
+        }
+        return AjaxResult.success();
+    }
 }

+ 13 - 9
ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java

@@ -1,24 +1,28 @@
 package com.ruoyi.common.utils.bean;
 
-import java.util.Set;
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
 import javax.validation.Validator;
+import java.util.Set;
 
 /**
  * bean对象属性验证
- * 
+ *
  * @author ruoyi
  */
-public class BeanValidators
-{
-    public static void validateWithException(Validator validator, Object object, Class<?>... groups)
-            throws ConstraintViolationException
-    {
+public class BeanValidators {
+    public static void validateWithException(Validator validator, Object object, Class<?>... groups) throws ConstraintViolationException {
         Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
-        if (!constraintViolations.isEmpty())
-        {
+        if (!constraintViolations.isEmpty()) {
             throw new ConstraintViolationException(constraintViolations);
         }
     }
+
+    public static void makeGenerateValidation(Validator validator, Object object, Class<?>... groups) throws ConstraintViolationException {
+        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
+        if (!constraintViolations.isEmpty()) {
+            throw new ValidationException("请点击编辑完善申请单信息再生成");
+        }
+    }
 }