lsw преди 1 година
родител
ревизия
554c26ea84

+ 0 - 55
admin-ui/src/components/placeSelect.vue

@@ -1,55 +0,0 @@
-<template>
-  <el-select v-model="placeId" :multiple="multiple" placeholder="请选择" :disabled="disabled" clearable>
-    <el-option v-for="item in placeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
-  </el-select>
-</template>
-
-<script>
-export default {
-  name: 'placeSelect',
-  props: {
-    value: {},
-    deptId: {},
-    multiple: {
-      type: Boolean,
-      default: false
-    },
-    disabled: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {
-      placeId: '',
-      placeList: []
-    };
-  },
-  watch: {
-    value(val) {
-      this.placeId = val;
-    },
-    deptId: {
-      handler(newValue, oldValue) {
-        if (oldValue != '') {
-          this.placeId = '';
-        }
-        this.getList();
-      },
-      immediate: true
-    },
-    placeId(val) {
-      this.$emit('input', val);
-    }
-  },
-  mounted() {},
-  methods: {
-    getList() {
-      //场所列表
-      this.ajax({ url: '/work/place/list/all', data: { deptId: this.deptId } }).then((response) => {
-        this.placeList = response.data;
-      });
-    }
-  }
-};
-</script>

+ 48 - 0
admin-ui/src/components/projectSelect.vue

@@ -0,0 +1,48 @@
+<template>
+  <el-select v-model="projectId" placeholder="请选择关联项目" clearable>
+    <el-option v-for="dict in projectList" :key="dict.projectName" :label="dict.projectName" :value="dict.id"></el-option>
+  </el-select>
+</template>
+
+<script>
+export default {
+  name: 'projectSelect',
+  props: {
+    value: {},
+    deptId: {},
+    multiple: {
+      type: Boolean,
+      default: false
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      projectId: '',
+      projectList: []
+    };
+  },
+  watch: {
+    value(val) {
+      this.projectId = val;
+    },
+    projectId(val) {
+      this.$emit('input', val);
+    }
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      //项目列表
+      this.ajax({ url: '/work/project/selectAll' }).then((response) => {
+        this.projectList = response.data;
+      });
+    }
+  }
+};
+</script>

+ 2 - 0
admin-ui/src/main.js

@@ -49,6 +49,7 @@ import editor from '@/components/editor'; //富文本
 import images from '@/components/images'; //图片上传
 import imagePreview from '@/components/imagePreview'; //图片预览
 import preview from '@/components/preview'; //图片预览
+import projectSelect from '@/components/projectSelect' //关联项目
 import util from '@/utils/util.js' //工具类
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts
@@ -84,6 +85,7 @@ Vue.component('file', file)
 Vue.component('images', images)
 Vue.component('imagePreview', imagePreview)
 Vue.component('preview', preview)
+Vue.component('projectSelect', projectSelect)
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)

+ 5 - 15
admin-ui/src/views/work/statement/audit/index.vue

@@ -8,9 +8,7 @@
         <el-input v-model="queryParams.batchName" placeholder="请输入结算批次" @keyup.enter.native="handleQuery" clearable />
       </el-form-item>
       <el-form-item label="关联项目" prop="projectId">
-        <el-select v-model="queryParams.projectId" placeholder="请选择关联项目" class="se" clearable>
-          <el-option v-for="dict in projectList" :key="dict.projectName" :label="dict.projectName" :value="dict.id"></el-option>
-        </el-select>
+        <projectSelect v-model="queryParams.projectId"></projectSelect>
       </el-form-item>
       <el-form-item label="审核状态" prop="audit">
         <el-select v-model="queryParams.audit" placeholder="充值状态" class="se" clearable>
@@ -24,7 +22,7 @@
         <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 235px)">
+    <el-table :data="response.rows" border height="calc(100vh - 235px)">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column type="index" label="序号" align="center" width="80" />
       <el-table-column label="结算单号" align="center" prop="num" width="160" />
@@ -48,8 +46,7 @@
           </el-popover>
         </template>
       </el-table-column>
-      <el-table-column label="创建人" align="center" prop="opBy" width="110" />
-      <el-table-column label="创建日期" align="center" prop="createTime" width="160" />
+      <el-table-column label="创建日期" align="center" prop="submitTime" width="160" />
       <el-table-column label="操作" align="center" width="200">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)">详情</el-button>
@@ -70,8 +67,6 @@ import record from './record';
 export default {
   data() {
     return {
-      ids: [],
-      projectList: [],
       showSearch: true,
       response: {},
       queryParams: {
@@ -80,14 +75,12 @@ export default {
         batchName: null,
         audit: null,
         projectId: null,
+        orderByColumn: 's.id',
         isAsc: 'desc'
       }
     };
   },
   created() {
-    this.ajax({ url: '/work/project/selectAll' }).then((response) => {
-      this.projectList = response.data;
-    });
     this.getList();
   },
   methods: {
@@ -104,11 +97,8 @@ export default {
       this.resetForm('queryForm');
       this.handleQuery();
     },
-    selects(rows) {
-      this.ids = rows.map((item) => item.id);
-    },
     op(tag, row) {
-      const id = row.id || this.ids[0];
+      const id = row.id;
       if (tag == 'detail') {
         this.iframe({ obj: record, param: { id: id, detail: true }, title: '查看详情', width: '75%', height: '65%' });
       }

+ 1 - 1
admin-ui/src/views/work/statement/give/index.vue

@@ -103,7 +103,7 @@ export default {
         this.iframe({ obj: record, param: { id: id, detail: true }, title: '查看详情', width: '75%', height: '65%' });
       }
       if (tag == 'send') {
-        this.iframe({ obj: send, param: { id: id}, title: '薪资发放', width: '55%', height: '60%' });
+        this.iframe({ obj: send, param: { id: id}, title: '薪资发放', width: '50%', height: '70%' });
       }
     }
   }

+ 12 - 9
admin-ui/src/views/work/statement/give/send.vue

@@ -11,18 +11,18 @@
       <div class="desc">账户余额(元)</div>
       <div class="money">{{ company.money }}</div>
     </div>
-    <el-table :data="response.rows" border>
-      <el-table-column label="结算单号" align="center" prop="name" width="100" />
-      <el-table-column label="应发人数" align="center" prop="idCard" width="170" />
-      <el-table-column label="应结算金额(元)" align="center" prop="idCard" width="170" />
-    </el-table>
     <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-      <el-form-item label="充值金额" prop="money">
+      <el-form-item label="结算单号" prop="money">
         <el-input type="number" v-model="form.money" placeholder="请输入充值金额" clearable />
       </el-form-item>
-      <el-form-item label="充值凭证" prop="certificate">
-        <ImageUpload v-model="form.certificate" :isShowTip="false" :limit="1"></ImageUpload>
-        <span class="tips">例如:付款或者转账截图</span>
+      <el-form-item label="应发人数" prop="money">
+        <el-input type="number" v-model="form.money" 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-item label="充值金额" prop="money">
+        <el-input type="number" v-model="form.money" placeholder="请输入充值金额" clearable />
       </el-form-item>
     </el-form>
     <div class="mfooter">
@@ -61,6 +61,9 @@ export default {
     this.ajax({ url: '/work/company/index' }).then((response) => {
       this.company = response.data;
     });
+    this.ajax({ url: '/work/statement/index' }).then((response) => {
+      this.company = response.data;
+    });
   },
   methods: {
     submitForm() {

+ 24 - 27
admin-ui/src/views/work/statement/make/edit.vue

@@ -15,19 +15,20 @@
         </el-select>
       </el-form-item>
       <el-form-item label="关联项目" prop="projectId">
-        <el-select v-model="form.projectId" placeholder="请选择关联项目">
-          <el-option v-for="dict in projectList" :key="dict.projectName" :label="dict.projectName" :value="dict.id" clearable></el-option>
-        </el-select>
+        <projectSelect v-model="form.projectId"></projectSelect>
       </el-form-item>
-      <el-form-item label="上传结算单" prop="projectId">
-        <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :auto-upload="false" :on-change="change" drag>
+      <el-form-item label="上传结算单">
+        <el-upload ref="upload" :limit="1" action="#" accept=".xlsx, .xls" :auto-upload="false" :on-remove="remove" :on-change="change" drag>
           <i class="el-icon-upload"></i>
           <div class="el-upload__text">
             将文件拖到此处,或
             <em>点击上传</em>
           </div>
-          <div class="el-upload__tip" slot="tip">
-            <a style="padding-left: 10px; color: #1890ff" @click="importTemplate()">下载模板</a>
+          <!-- 上传提示 -->
+          <div class="el-upload__tip" slot="tip" style="margin-top: 0px; line-height: 30px">
+            <span>仅允许导入“xls”或“xlsx”格式文件,请</span>
+            <a style="padding-left: 10px; color: #1890ff" @click="importTemplate()">下载结算模板</a>
+            <span>,并编辑完后再上传</span>
           </div>
         </el-upload>
       </el-form-item>
@@ -40,16 +41,16 @@
 </template>
 
 <script>
-import { getToken } from '@/utils/auth';
-let formData = new FormData();
 export default {
   dicts: ['invoice', 'channel'],
   data() {
     return {
-      projectList: [],
       form: {},
       rules: {
-        peoples: [{ required: true, message: '发放人数不能为空', trigger: 'blur' }]
+        batchName: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        invoice: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        channel: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        projectId: [{ required: true, message: '不能为空', trigger: 'blur' }]
       }
     };
   },
@@ -64,22 +65,8 @@ export default {
       type: String
     }
   },
-  mounted() {
-    this.ajax({ url: '/work/project/selectAll' }).then((response) => {
-      this.projectList = response.data;
-    });
-    if (this.param.id) {
-      this.ajax({ url: '/work/statement/detail/' + this.param.id }).then((response) => {
-        this.form = response.data;
-      });
-    }
-  },
   methods: {
-    /** 下载模板操作 */
-    importTemplate() {
-      this.download('work/statement/importTemplate', {}, '结算单模版.xlsx');
-    },
-    change(file) {
+    change(file, fileList) {
       if (file.name.indexOf('.xls') == -1) {
         this.msgError('仅允许导入“xls”或“xlsx”格式文件。');
         this.$refs.upload.clearFiles();
@@ -87,14 +74,24 @@ export default {
       }
       this.form.file = file.raw;
     },
+    remove(file) {
+      this.form.file = '';
+    },
+    importTemplate() {
+      this.download('work/statement/importTemplate', {}, '结算单模版.xlsx');
+    },
     submitForm() {
       this.$refs['form'].validate((valid) => {
         if (valid) {
+          if (!this.form.file) {
+            this.$modal.msgError('请上传结算单');
+            return;
+          }
           let formData = new FormData();
           for (let key in this.form) {
             formData.append(key, this.form[key]);
           }
-          this.ajax({ method: 'post', url: '/work/statement/add', data: formData }).then((response) => {
+          this.ajax({ method: 'post', url: '/work/statement/make/add', data: formData }).then((response) => {
             this.$modal.msgSuccess('创建成功');
             this.$layer.close(this.layerid);
             this.$parent.getList();

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

@@ -5,9 +5,7 @@
         <el-input v-model="queryParams.batchName" placeholder="请输入结算批次" @keyup.enter.native="handleQuery" clearable />
       </el-form-item>
       <el-form-item label="关联项目" prop="projectId">
-        <el-select v-model="queryParams.projectId" placeholder="请选择关联项目" class="se" clearable>
-          <el-option v-for="dict in projectList" :key="dict.projectName" :label="dict.projectName" :value="dict.id"></el-option>
-        </el-select>
+        <projectSelect v-model="queryParams.projectId"></projectSelect>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@@ -15,27 +13,29 @@
       </el-form-item>
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <el-button type="primary" icon="el-icon-plus" :disabled="ids.length > 0" @click="op('add')" v-hasPermi="['work:statement:add']">新增</el-button>
-      <el-button type="success" icon="el-icon-edit" :disabled="ids.length != 1" @click="op('edit', ids)" v-hasPermi="['work:statement:edit']">修改</el-button>
-      <el-button type="danger" icon="el-icon-delete" :disabled="ids.length == 0" @click="del" v-hasPermi="['work:statement:remove']">删除{{ ids.length > 0 ? '(' + ids.length + ')' : '' }}</el-button>
+      <el-button type="primary" icon="el-icon-download" @click="op('download')">下载模板</el-button>
+      <el-button type="primary" icon="el-icon-document-add" @click="op('add')">创建结算单</el-button>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 270px)">
-      <el-table-column type="selection" width="55" align="center" />
+    <el-table :data="response.rows" border height="calc(100vh - 270px)">
       <el-table-column type="index" label="序号" align="center" width="80" />
       <el-table-column label="上传文档名称" align="center" prop="fileName" />
-      <el-table-column label="结算批次" align="center" prop="batchName" />
-      <el-table-column label="关联项目" align="center" prop="projectName" />
-      <el-table-column label="发放金额(元)" align="center" prop="money" width="130" />
-      <el-table-column label="发放人数" align="center" prop="peoples" width="130" />
-      <el-table-column label="创建人" align="center" prop="opBy" width="130" />
-      <el-table-column label="创建日期" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center" width="250">
+      <el-table-column label="结算批次" align="center" prop="batchName" width="180" />
+      <el-table-column label="关联项目" align="center" prop="projectName" width="180" />
+      <el-table-column label="发放金额(元)" align="center" prop="money" width="110" />
+      <el-table-column label="发放人数" align="center" prop="peoples" width="110" />
+      <el-table-column label="生成状态" align="center" width="110">
         <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:statement:list']">详情</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('generate', scope.row)" v-hasPermi="['work:statement:edit']" v-if="scope.row.state === 0">生成结算单</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:statement:edit']" v-if="scope.row.state === 0">修改</el-button>
-          <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:statement:remove']" v-if="scope.row.state === 0">删除</el-button>
+          <el-tag type="info" v-if="scope.row.state == 0">待生成</el-tag>
+          <el-tag type="success" v-if="scope.row.state == 1">已生成</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建日期" align="center" prop="createTime" width="170" />
+      <el-table-column label="操作" align="center" width="230">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('generate', scope.row)" v-if="scope.row.state === 0">生成结算单</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-if="scope.row.state === 0">删除</el-button>
         </template>
       </el-table-column>
       <template slot="empty">
@@ -52,8 +52,6 @@ import record from './record';
 export default {
   data() {
     return {
-      ids: [],
-      projectList: [],
       showSearch: true,
       response: {},
       queryParams: {
@@ -61,19 +59,17 @@ export default {
         pageSize: 10,
         batchName: null,
         projectId: null,
+        orderByColumn: 's.id',
         isAsc: 'desc'
       }
     };
   },
   created() {
-    this.ajax({ url: '/work/project/selectAll' }).then((response) => {
-      this.projectList = response.data;
-    });
     this.getList();
   },
   methods: {
     getList() {
-      this.ajax({ url: '/work/statement/list', data: this.queryParams }).then((response) => {
+      this.ajax({ url: '/work/statement/make', data: this.queryParams }).then((response) => {
         this.response = response;
       });
     },
@@ -85,15 +81,16 @@ export default {
       this.resetForm('queryForm');
       this.handleQuery();
     },
-    selects(rows) {
-      this.ids = rows.map((item) => item.id);
-    },
     op(tag, row) {
       if (tag == 'add') {
-        this.iframe({ obj: edit, param: {}, title: '创建结算单', width: '40%', height: '65%' });
+        this.iframe({ obj: edit, param: {}, title: '创建结算单', width: '40%', height: '63%' });
+        return;
+      }
+      if (tag == 'download') {
+        this.download('work/statement/importTemplate', {}, '结算单模版.xlsx');
         return;
       }
-      const id = row.id || this.ids[0];
+      const id = row.id;
       if (tag == 'detail') {
         this.iframe({ obj: record, param: { id: id, detail: true }, title: '查看结算单明细', width: '65%', height: '65%' });
       }
@@ -102,7 +99,7 @@ export default {
       }
       if (tag == 'generate') {
         this.$confirm('是否确认生成结算单?', '警告', { type: 'warning' }).then(() => {
-          this.ajax({ url: '/work/statement/generate/' + id }).then((response) => {
+          this.ajax({ url: '/work/statement/make/generate/' + id }).then((response) => {
             this.$modal.msgSuccess('生成成功');
             this.getList();
           });
@@ -111,7 +108,7 @@ export default {
     },
     del(row) {
       this.$confirm('是否确认删除选中数据?', '警告', { type: 'warning' }).then(() => {
-        this.get({ url: '/work/statement/remove/' + (row.id || this.ids) }).then((response) => {
+        this.get({ url: '/work/statement/make/remove/' + row.id }).then((response) => {
           this.$modal.msgSuccess('删除成功');
           this.getList();
         });

+ 5 - 15
admin-ui/src/views/work/statement/manage/index.vue

@@ -5,16 +5,14 @@
         <el-input v-model="queryParams.batchName" placeholder="请输入结算批次" @keyup.enter.native="handleQuery" clearable />
       </el-form-item>
       <el-form-item label="关联项目" prop="projectId">
-        <el-select v-model="queryParams.projectId" placeholder="请选择关联项目" class="se" clearable>
-          <el-option v-for="dict in projectList" :key="dict.projectName" :label="dict.projectName" :value="dict.id"></el-option>
-        </el-select>
+        <projectSelect v-model="queryParams.projectId"></projectSelect>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 235px)">
+    <el-table :data="response.rows" border height="calc(100vh - 235px)">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column type="index" label="序号" align="center" width="80" />
       <el-table-column label="结算单号" align="center" prop="num" width="160" />
@@ -38,8 +36,7 @@
           </el-popover>
         </template>
       </el-table-column>
-      <el-table-column label="创建人" align="center" prop="opBy" width="110" />
-      <el-table-column label="创建日期" align="center" prop="createTime" width="160" />
+      <el-table-column label="创建日期" align="center" prop="generateTime" width="160" />
       <el-table-column label="操作" align="center" width="200">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:statement:manage']">详情</el-button>
@@ -60,8 +57,6 @@ import record from './record';
 export default {
   data() {
     return {
-      ids: [],
-      projectList: [],
       showSearch: true,
       response: {},
       queryParams: {
@@ -69,14 +64,12 @@ export default {
         pageSize: 10,
         batchName: null,
         projectId: null,
+        orderByColumn: 's.id',
         isAsc: 'desc'
       }
     };
   },
   created() {
-    this.ajax({ url: '/work/project/selectAll' }).then((response) => {
-      this.projectList = response.data;
-    });
     this.getList();
   },
   methods: {
@@ -93,11 +86,8 @@ export default {
       this.resetForm('queryForm');
       this.handleQuery();
     },
-    selects(rows) {
-      this.ids = rows.map((item) => item.id);
-    },
     op(tag, row) {
-      const id = row.id || this.ids[0];
+      const id = row.id;
       if (tag == 'detail') {
         this.iframe({ obj: record, param: { id: id, detail: true }, title: '查看详情', width: '75%', height: '65%' });
       }

+ 30 - 28
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/StatementController.java

@@ -16,7 +16,6 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -34,9 +33,13 @@ public class StatementController extends BaseController {
     @Autowired
     private IStatementDetailService detailService;
 
-    @PreAuthorize("@ss.hasPermi('work:statement:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(Statement statement) {
+    /**
+     * 制单管理
+     */
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
+    @GetMapping("/make")
+    public TableDataInfo make(Statement statement) {
+        statement.setAuditors(false);
         statement.setCompanyId(getLoginUser().getUser().getCompanyId());
         startPage();
         List<Statement> list = statementService.selectList(statement);
@@ -52,6 +55,7 @@ public class StatementController extends BaseController {
         statement.setState(1);
         statement.setAudit(null);
         statement.setGive(null);
+        statement.setAuditors(false);
         statement.setCompanyId(getLoginUser().getUser().getCompanyId());
         startPage();
         List<Statement> list = statementService.selectList(statement);
@@ -65,9 +69,10 @@ public class StatementController extends BaseController {
     @GetMapping("/audit")
     public TableDataInfo audit(Statement statement) {
         statement.setState(1);
+        statement.setAuditors(true);
         statement.setCompanyId(getLoginUser().getUser().getCompanyId());
         startPage();
-        List<Statement> list = statementService.selectAuditList(statement);
+        List<Statement> list = statementService.selectList(statement);
         return getDataTable(list);
     }
 
@@ -79,6 +84,7 @@ public class StatementController extends BaseController {
     public TableDataInfo give(Statement statement) {
         statement.setState(1);
         statement.setAudit(2);
+        statement.setAuditors(false);
         statement.setCompanyId(getLoginUser().getUser().getCompanyId());
         startPage();
         List<Statement> list = statementService.selectList(statement);
@@ -113,42 +119,38 @@ public class StatementController extends BaseController {
         return getDataTable(list);
     }
 
-    @PreAuthorize("@ss.hasPermi('work:statement:add')")
-    @Log(title = "创建结算单", businessType = BusinessType.INSERT)
-    @PostMapping("/add")
-    public AjaxResult add(@Validated Statement statement) throws Exception {
-        ExcelUtil<StatementDetail> util = new ExcelUtil<StatementDetail>(StatementDetail.class);
-        List<StatementDetail> detailList = util.importExcel(statement.getFile().getInputStream());
-        return statementService.add(detailList, statement);
-    }
-
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
     @Log(title = "生成结算单", businessType = BusinessType.UPDATE)
-    @GetMapping("/generate/{id}")
-    public AjaxResult generate(@PathVariable("id") Long id) {
-        return statementService.generate(id);
+    @GetMapping("/make/generate/{id}")
+    public AjaxResult makeGenerate(@PathVariable("id") Long id) {
+        return statementService.makeGenerate(id);
     }
 
 
-    @PreAuthorize("@ss.hasPermi('work:statement:query')")
+    @PreAuthorize("@ss.hasAnyPermi('system:user:add,work:statement:give')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id) {
         return AjaxResult.success(statementService.getById(id));
     }
 
-    @PreAuthorize("@ss.hasPermi('work:statement:edit')")
-    @Log(title = "结算单管理", businessType = BusinessType.UPDATE)
-    @PostMapping("/edit")
-    public AjaxResult edit(@RequestBody Statement statement) {
-        return toAjax(statementService.updateById(statement));
+
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
+    @Log(title = "创建结算单", businessType = BusinessType.INSERT)
+    @PostMapping("/make/add")
+    public AjaxResult makeAdd(@Validated Statement statement) throws Exception {
+        ExcelUtil<StatementDetail> util = new ExcelUtil<StatementDetail>(StatementDetail.class);
+        List<StatementDetail> detailList = util.importExcel(statement.getFile().getInputStream());
+        return statementService.makeAdd(detailList, statement);
     }
 
-    @PreAuthorize("@ss.hasPermi('work:statement:remove')")
-    @Log(title = "结算单管理", businessType = BusinessType.DELETE)
-    @GetMapping("/remove/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids) {
-        return toAjax(statementService.removeByIds(Arrays.asList(ids)));
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
+    @Log(title = "删除结算单", businessType = BusinessType.DELETE)
+    @GetMapping("/make/remove/{id}")
+    public AjaxResult makeRemove(@PathVariable Long id) {
+        return statementService.makeRemove(id);
     }
 
+    @PreAuthorize("@ss.hasPermi('work:statement:make')")
     @PostMapping("/importTemplate")
     public void importTemplate(HttpServletResponse response) {
         ExcelUtil<StatementDetail> util = new ExcelUtil<StatementDetail>(StatementDetail.class);

+ 25 - 9
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Statement.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.web.work.domain.base.BaseData;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -14,6 +15,7 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
+
 /**
  * @author lsw
  * @date 2024-04-20
@@ -21,7 +23,7 @@ import java.util.Date;
 @Data
 @TableName(value = "tb_statement")
 @Accessors(chain = true)
-public class Statement{
+public class Statement extends BaseData {
     private static final long serialVersionUID = 1L;
 
     private Long id;
@@ -35,9 +37,6 @@ public class Statement{
     @ApiModelProperty(value = "上传文档名称")
     private String fileName;
 
-    @ApiModelProperty(value = "文档路径")
-    private String filePath;
-
     @NotBlank(message = "结算批次不能为空")
     @ApiModelProperty(value = "结算批次")
     private String batchName;
@@ -63,21 +62,22 @@ public class Statement{
     @ApiModelProperty(value = "关联项目")
     private Long projectId;
 
+    @ApiModelProperty(value = "服务公司")
+    private String serviceCompany;
+
     @ApiModelProperty(value = "制单状态:0=待生成,1=已生成")
     private Integer state;
 
-    @ApiModelProperty(value = "是否审核:0=待提交审核,1=待审核,2=审核通过,3=驳回")
+    @ApiModelProperty(value = "是否审核:0=待提交,1=待审核,2=审核通过,3=驳回")
     private Integer audit;
 
-    @ApiModelProperty(value = "驳回原因")
+    @ApiModelProperty(value = "审核驳回原因")
     private String msg;
 
     @ApiModelProperty(value = "发放状态:0=待发放,1=已发放")
     private Integer give;
 
-    @ApiModelProperty(value = "服务公司")
-    private String serviceCompany;
-
+    @ApiModelProperty(value = "创建者")
     private String opBy;
 
     @TableField(fill = FieldFill.INSERT)
@@ -91,6 +91,22 @@ public class Statement{
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "生成时间")
+    private Date generateTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "提审时间")
+    private Date submitTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "审核时间")
+    private Date auditTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "发放时间")
+    private Date giveTime;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "项目名称")
     private String projectName;

+ 5 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/base/BaseData.java

@@ -23,4 +23,9 @@ public class BaseData {
     @TableField(exist = false)
     @JsonIgnore
     private String dateEnd;
+
+    //结算单审核人
+    @TableField(exist = false)
+    @JsonIgnore
+    private boolean auditors;
 }

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

@@ -18,22 +18,25 @@ public interface IStatementService extends IService<Statement> {
 
     /**
      * 创建结算单
+     *
      * @param list
      * @param statement
      * @return
      */
-    AjaxResult add(List<StatementDetail> list, Statement statement);
+    AjaxResult makeAdd(List<StatementDetail> list, Statement statement);
 
     /**
      * 生成结算单
+     *
      * @param id
      * @return
      */
-    AjaxResult generate(Long id);
+    AjaxResult makeGenerate(Long id);
 
 
     /**
      * 提交结算单审核
+     *
      * @param id
      * @return
      */
@@ -41,6 +44,7 @@ public interface IStatementService extends IService<Statement> {
 
     /**
      * 撤回结算单审核
+     *
      * @param id
      * @return
      */
@@ -48,8 +52,17 @@ public interface IStatementService extends IService<Statement> {
 
     /**
      * 结算单审核通过
+     *
      * @param id
      * @return
      */
     AjaxResult auditSuccess(Long id);
+
+    /**
+     * 删除结算单(只有未生成的才能删除)
+     *
+     * @param id
+     * @return
+     */
+    AjaxResult makeRemove(Long id);
 }

+ 23 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/StatementServiceImpl.java

@@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.validation.Validator;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -56,7 +57,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
 
     @Transactional
     @Override
-    public AjaxResult add(List<StatementDetail> list, Statement statement) {
+    public AjaxResult makeAdd(List<StatementDetail> list, Statement statement) {
         if (StringUtils.isNull(list) || list.size() == 0) {
             throw new ServiceException("上传结算单数据不能为空!");
         }
@@ -95,7 +96,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
     }
 
     @Override
-    public AjaxResult generate(Long id) {
+    public AjaxResult makeGenerate(Long id) {
         Statement statement = getById(id);
         if (statement == null || !statement.getCompanyId().equals(SecurityUtils.getLoginUser().getUser().getCompanyId())) {
             return AjaxResult.error("结算单不存在或非法操作");
@@ -105,6 +106,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
         }
         statement.setState(1);
         statement.setNum(StringUtils.generateNumber());
+        statement.setGenerateTime(new Date());
         if (!updateById(statement)) {
             throw new ServiceException("生成结算单失败,请联系平台");
         }
@@ -121,6 +123,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
             return AjaxResult.error("不可操作");
         }
         statement.setAudit(1);
+        statement.setSubmitTime(new Date());
         if (!updateById(statement)) {
             throw new ServiceException("提交结算单审核失败,请联系平台");
         }
@@ -134,7 +137,7 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
             return AjaxResult.error("结算单不存在或非法操作");
         }
         if (statement.getAudit() != 1) {
-            return AjaxResult.error("不可操作");
+            return AjaxResult.error("当前结算单不能撤回");
         }
         statement.setAudit(0);
         if (!updateById(statement)) {
@@ -150,12 +153,28 @@ public class StatementServiceImpl extends ServiceImpl<StatementMapper, Statement
             return AjaxResult.error("结算单不存在或非法操作");
         }
         if (statement.getAudit() != 1) {
-            return AjaxResult.error("数据不可操作");
+            return AjaxResult.error("当前结算单不能被审核");
         }
         statement.setAudit(2);
+        statement.setAuditTime(new Date());
         if (!updateById(statement)) {
             throw new ServiceException("结算单审核失败,请联系平台");
         }
         return AjaxResult.success();
     }
+
+    @Override
+    public AjaxResult makeRemove(Long id) {
+        Statement statement = getById(id);
+        if (statement == null || !statement.getCompanyId().equals(SecurityUtils.getLoginUser().getUser().getCompanyId())) {
+            return AjaxResult.error("结算单不存在或非法操作");
+        }
+        if (statement.getState() != 0) {
+            return AjaxResult.error("当前结算单不能删除");
+        }
+        if (!removeById(id)) {
+            throw new ServiceException("删除结算单失败,请联系平台");
+        }
+        return AjaxResult.success();
+    }
 }

+ 17 - 7
ruoyi-admin/src/main/resources/mapper/work/StatementMapper.xml

@@ -8,14 +8,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             s.id,
             s.num,
+            s.state,
             s.audit,
+            s.give,
             s.batch_name,
-            s.create_time,
-            s.op_by,
             s.file_name,
-            s.state,
             s.service_company,
-            s.give,
+            s.create_time,
+            s.generate_time,
+            s.submit_time,
+            s.audit_time,
+            s.give_time,
             ( SELECT COUNT( d.id ) FROM tb_statement_detail d WHERE d.statement_id = s.id ) AS peoples,
             ( SELECT SUM( d.money ) FROM tb_statement_detail d WHERE d.statement_id = s.id ) AS money,
             p.project_name
@@ -31,8 +34,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="num != null  and num != ''"> and s.num like concat('%', #{num}, '%')</if>
             <if test="projectId != null "> and s.project_id = #{projectId}</if>
             <if test="state != null "> and s.state = #{state}</if>
-            <if test="audit != null "> and s.audit = #{audit}</if>
             <if test="give != null "> and s.give = #{give}</if>
+            <choose>
+                <when test="auditors">
+                    <if test="audit == null "> and s.audit <![CDATA[ >= ]]> 1</if>
+                    <if test="audit != null "> and s.audit=#{audit} and s.audit <![CDATA[ >= ]]> 1</if>
+                </when>
+                <otherwise>
+                    <if test="audit != null "> and s.audit = #{audit}</if>
+                </otherwise>
+            </choose>
         </where>
     </select>
     <!--结算单审核列表-->
@@ -44,8 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="num != null  and num != ''"> and s.num like concat('%', #{num}, '%')</if>
             <if test="state != null "> and s.state = #{state}</if>
             <if test="projectId != null "> and s.project_id = #{projectId}</if>
-            <if test="audit == null "> and s.audit <![CDATA[ >= ]]> 1</if>
-            <if test="audit != null "> and s.audit=#{audit} and s.audit <![CDATA[ >= ]]> 1</if>
+
         </where>
     </select>