lsw 1 gadu atpakaļ
vecāks
revīzija
98c0c933ba

+ 1 - 1
admin-ui/src/App.vue

@@ -21,7 +21,7 @@ export default {
 /**挂载iconfont字体图标*/
 @font-face {
   font-family: 'iconfont';
-  src: url('https://at.alicdn.com/t/c/font_4351794_undxzgntcbq.ttf?t=1701249609699') format('truetype');
+  src: url('https://at.alicdn.com/t/c/font_4507607_hm22relzejc.ttf?t=1713333144935') format('truetype');
   /* src: url('~@/static/font/iconfont.ttf') format('truetype'); */
 }
 .icon {

BIN
admin-ui/src/assets/images/rz.png


+ 11 - 4
admin-ui/src/assets/styles/extend.scss

@@ -314,7 +314,7 @@
     flex: 0.17;
     padding-right: 20px;
     overflow: hidden;
-    &.active{
+    &.active {
       flex: 0.05;
     }
   }
@@ -322,12 +322,19 @@
     flex: 1;
   }
 }
-.sfz{
-  border-radius:5px;
+.sfz {
+  border-radius: 5px;
   width: 200px;
 }
-.bs{
+.bs {
   color: darkgray;
   padding-bottom: 15px;
   padding-top: 5px;
 }
+.tips {
+  color: #919191;
+  font-size: 13px;
+}
+.cg{
+  margin-bottom: 15px
+}

+ 46 - 49
admin-ui/src/components/ImageUpload/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="component-upload-image">
+  <div :style="{ marginBottom: fileList.length > 0 ? '-22px' : '0' }">
     <el-upload
       multiple
       :action="uploadImgUrl"
@@ -15,53 +15,50 @@
       :headers="headers"
       :file-list="fileList"
       :on-preview="handlePictureCardPreview"
-      :class="{hide: this.fileList.length >= this.limit}"
+      :accept="accept"
+      :class="{ hide: this.fileList.length >= this.limit }"
     >
       <i class="el-icon-plus"></i>
     </el-upload>
 
     <!-- 上传提示 -->
-    <div class="el-upload__tip" slot="tip" v-if="showTip" style="margin-top: 0px;line-height: 30px;">
+    <div class="el-upload__tip" slot="tip" v-if="showTip" style="margin-top: 0px; line-height: 30px">
       请上传
-      <template v-if="fileSize"> 大小不超过 {{ fileSize }}MB </template>
-      <template v-if="fileType"> 格式为{{ fileType.join("/") }} </template>
+      <template v-if="fileSize">大小不超过 {{ fileSize }}MB</template>
+      <template v-if="fileType">格式为{{ fileType.join('/') }}</template>
       的文件
     </div>
 
-    <el-dialog
-      :visible.sync="dialogVisible"
-      title="预览"
-      width="800"
-      append-to-body
-    >
-      <img
-        :src="dialogImageUrl"
-        style="display: block; max-width: 100%; margin: 0 auto"
-      />
+    <el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body>
+      <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
     </el-dialog>
   </div>
 </template>
 
 <script>
-import { getToken } from "@/utils/auth";
+import { getToken } from '@/utils/auth';
 
 export default {
   props: {
     value: [String, Object, Array],
     // 图片数量限制
+    accept: {
+      type: String,
+      default: '.jpeg,.jpg,.png'
+    },
     limit: {
       type: Number,
-      default: 5,
+      default: 5
     },
     // 大小限制(MB)
     fileSize: {
-       type: Number,
-      default: 5,
+      type: Number,
+      default: 5
     },
     // 文件类型, 例如['png', 'jpg', 'jpeg']
     fileType: {
       type: Array,
-      default: () => ["png", "jpg", "jpeg"],
+      default: () => ['png', 'jpg', 'jpeg']
     },
     // 是否显示提示
     isShowTip: {
@@ -73,13 +70,13 @@ export default {
     return {
       number: 0,
       uploadList: [],
-      dialogImageUrl: "",
+      dialogImageUrl: '',
       dialogVisible: false,
       hideUpload: false,
       baseUrl: process.env.VUE_APP_BASE_API,
-      uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
+      uploadImgUrl: process.env.VUE_APP_BASE_API + '/common/upload', // 上传的图片服务器地址
       headers: {
-        Authorization: "Bearer " + getToken(),
+        Authorization: 'Bearer ' + getToken()
       },
       fileList: []
     };
@@ -91,12 +88,12 @@ export default {
           // 首先将值转为数组
           const list = Array.isArray(val) ? val : this.value.split(',');
           // 然后将数组转为对象数组
-          this.fileList = list.map(item => {
-            if (typeof item === "string") {
+          this.fileList = list.map((item) => {
+            if (typeof item === 'string') {
               if (item.indexOf(this.baseUrl) === -1) {
-                  item = { name: this.baseUrl + item, url: this.baseUrl + item };
+                item = { name: this.baseUrl + item, url: this.baseUrl + item };
               } else {
-                  item = { name: item, url: item };
+                item = { name: item, url: item };
               }
             }
             return item;
@@ -114,28 +111,28 @@ export default {
     // 是否显示提示
     showTip() {
       return this.isShowTip && (this.fileType || this.fileSize);
-    },
+    }
   },
   methods: {
     // 上传前loading加载
     handleBeforeUpload(file) {
       let isImg = false;
       if (this.fileType.length) {
-        let fileExtension = "";
-        if (file.name.lastIndexOf(".") > -1) {
-          fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
+        let fileExtension = '';
+        if (file.name.lastIndexOf('.') > -1) {
+          fileExtension = file.name.slice(file.name.lastIndexOf('.') + 1);
         }
-        isImg = this.fileType.some(type => {
+        isImg = this.fileType.some((type) => {
           if (file.type.indexOf(type) > -1) return true;
           if (fileExtension && fileExtension.indexOf(type) > -1) return true;
           return false;
         });
       } else {
-        isImg = file.type.indexOf("image") > -1;
+        isImg = file.type.indexOf('image') > -1;
       }
 
       if (!isImg) {
-        this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
+        this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join('/')}图片格式文件!`);
         return false;
       }
       if (this.fileSize) {
@@ -145,7 +142,7 @@ export default {
           return false;
         }
       }
-      this.$modal.loading("正在上传图片,请稍候...");
+      this.$modal.loading('正在上传图片,请稍候...');
       this.number++;
     },
     // 文件个数超出
@@ -167,15 +164,15 @@ export default {
     },
     // 删除图片
     handleDelete(file) {
-      const findex = this.fileList.map(f => f.name).indexOf(file.name);
-      if(findex > -1) {
+      const findex = this.fileList.map((f) => f.name).indexOf(file.name);
+      if (findex > -1) {
         this.fileList.splice(findex, 1);
-        this.$emit("input", this.listToString(this.fileList));
+        this.$emit('input', this.listToString(this.fileList));
       }
     },
     // 上传失败
     handleUploadError() {
-      this.$modal.msgError("上传图片失败,请重试");
+      this.$modal.msgError('上传图片失败,请重试');
       this.$modal.closeLoading();
     },
     // 上传结束处理
@@ -184,7 +181,7 @@ export default {
         this.fileList = this.fileList.concat(this.uploadList);
         this.uploadList = [];
         this.number = 0;
-        this.$emit("input", this.listToString(this.fileList));
+        this.$emit('input', this.listToString(this.fileList));
         this.$modal.closeLoading();
       }
     },
@@ -195,11 +192,11 @@ export default {
     },
     // 对象转成指定字符串分隔
     listToString(list, separator) {
-      let strs = "";
-      separator = separator || ",";
+      let strs = '';
+      separator = separator || ',';
       for (let i in list) {
         if (list[i].url) {
-          strs += list[i].url.replace(this.baseUrl, "") + separator;
+          strs += list[i].url.replace(this.baseUrl, '') + separator;
         }
       }
       return strs != '' ? strs.substr(0, strs.length - 1) : '';
@@ -210,17 +207,17 @@ export default {
 <style scoped lang="scss">
 // .el-upload--picture-card 控制加号部分
 ::v-deep.hide .el-upload--picture-card {
-    display: none;
+  display: none;
 }
 // 去掉动画效果
 ::v-deep .el-list-enter-active,
 ::v-deep .el-list-leave-active {
-    transition: all 0s;
+  transition: all 0s;
 }
 
-::v-deep .el-list-enter, .el-list-leave-active {
-    opacity: 0;
-    transform: translateY(0);
+::v-deep .el-list-enter,
+.el-list-leave-active {
+  opacity: 0;
+  transform: translateY(0);
 }
 </style>
-

+ 87 - 0
admin-ui/src/views/work/money/index.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="app-container">
+    <div class="cmain">
+      <div class="cards">
+        <div class="ctop">
+          <span class="icon">&#xe646;</span>
+          <span class="ctitle">{{ form.companyName }}</span>
+          <img :src="rz" class="rz" />
+        </div>
+        <div class="desc">账户余额(元)</div>
+        <div class="money">{{ form.money }}</div>
+        <el-row :gutter="10" class="btm">
+          <el-button type="primary" icon="el-icon-minus" @click="op('add')">提现</el-button>
+          <el-button type="primary" icon="el-icon-plus" @click="op('add')" v-hasPermi="['work:recharge:add']">充值</el-button>
+          <el-button type="primary" icon="el-icon-document" @click="op('recharge_list')" v-hasPermi="['work:recharge:list']">充值明细</el-button>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import recharge_edit from './recharge/edit.vue';
+import recharge_list from './recharge/record.vue';
+import rz from '@/assets/images/rz.png';
+export default {
+  name: 'Money',
+  data() {
+    return {
+      rz: rz,
+      form: {},
+      rules: {
+        serviceCompany: [{ required: true, message: '服务公司不能为空', trigger: 'blur' }],
+        bankName: [{ required: true, message: '开户行不能为空', trigger: 'blur' }],
+        bankAccount: [{ required: true, message: '银行卡号不能为空', trigger: 'blur' }]
+      }
+    };
+  },
+  mounted() {
+    this.ajax({ url: '/work/company/index' }).then((response) => {
+      this.form = response.data;
+    });
+  },
+  methods: {
+    op(tag, row) {
+      if (tag == 'add') {
+        this.iframe({ obj: recharge_edit, param: {}, title: '充值申请', width: '40%', height: '65%' });
+      }
+      if (tag == 'recharge_list') {
+        this.iframe({ obj: recharge_list, param: {}, title: '充值明细', width: '70%', height: '90.5%' });
+      }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.cards {
+  border-radius: 10px;
+  border: 1px solid #1890ff;
+  padding: 20px;
+  .ctop {
+    .icon {
+      font-size: 20px;
+      padding-right: 5px;
+    }
+    .ctitle {
+      font-size: 16px;
+    }
+    .rz {
+      float: right;
+      width: 80px;
+    }
+  }
+  .desc {
+    color: #8c8c8c;
+    padding-top: 20px;
+  }
+  .money {
+    padding-top: 20px;
+    font-size: 30px;
+    color: #1890ff;
+  }
+  .btm {
+    padding-top: 20px;
+  }
+}
+</style>

+ 94 - 0
admin-ui/src/views/work/money/recharge/audit.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="cmain">
+    <div class="bos">
+      <div class="lab">
+        <div class="bsg"></div>
+        <div class="tit">充值账户信息</div>
+      </div>
+      <el-form ref="platform" :model="platform" label-width="100px">
+        <el-form-item label="服务公司名称">
+          <el-input v-model="platform.serviceCompany" disabled />
+        </el-form-item>
+        <el-form-item label="开户行">
+          <el-input v-model="platform.bankName" disabled />
+        </el-form-item>
+        <el-form-item label="充值账户">
+          <el-input v-model="platform.bankAccount" disabled />
+        </el-form-item>
+      </el-form>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="充值金额" prop="money">
+          <el-input type="number" v-model="form.money" disabled />
+        </el-form-item>
+        <el-form-item label="充值凭证" prop="certificate">
+          <ImageUpload v-model="form.certificate" :isShowTip="false" :limit="1"></ImageUpload>
+        </el-form-item>
+      </el-form>
+      <el-alert title="充值成功" type="success" show-icon class="cg" v-if="form.state === 1"></el-alert>
+      <el-alert :title="'充值失败:' + form.msg" type="error" show-icon class="cg" v-if="form.state === 2"></el-alert>
+    </div>
+    <div class="mfooter" v-if="!param.detail">
+      <el-button type="primary" @click="submitForm(1)">确 认</el-button>
+      <el-button type="danger" @click="submitForm(2)">无 效</el-button>
+      <el-button @click="$layer.close(layerid)">取 消</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      platform: {},
+      form: {},
+      rules: {}
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    this.ajax({ url: '/work/platform/detail' }).then((response) => {
+      this.platform = response.data;
+    });
+    if (this.param.id) {
+      this.ajax({ url: '/work/recharge/detail/' + this.param.id }).then((response) => {
+        this.form = response.data;
+      });
+    }
+  },
+  methods: {
+    submitForm(state) {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$prompt(state == 1 ? '确认充值?' : '确认无效充值', {
+            type: 'warning',
+            showInput: state == 1 ? false : true,
+            inputType: 'text',
+            inputPlaceholder: '无效原因',
+            inputValidator: (value) => {
+              if (!value && state == 2) {
+                return '请输入无效原因';
+              }
+            }
+          }).then(({ value }) => {
+            this.post({ url: '/work/recharge/edit', data: { id: this.form.id, state: state, msg: value } }).then((response) => {
+              this.$modal.msgSuccess('操作成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          });
+        }
+      });
+    }
+  }
+};
+</script>

+ 92 - 0
admin-ui/src/views/work/money/recharge/edit.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="cmain">
+    <div class="bos">
+      <div class="lab">
+        <div class="bsg"></div>
+        <div class="tit">充值账户信息</div>
+      </div>
+      <el-form ref="platform" :model="platform" label-width="100px">
+        <el-form-item label="服务公司名称">
+          <el-input v-model="platform.serviceCompany" disabled />
+        </el-form-item>
+        <el-form-item label="开户行">
+          <el-input v-model="platform.bankName" disabled />
+        </el-form-item>
+        <el-form-item label="充值账户">
+          <el-input v-model="platform.bankAccount" disabled />
+        </el-form-item>
+      </el-form>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <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>
+      </el-form>
+      <el-alert title="充值申请提交后,平台审核确认即可充值到账" type="info" show-icon style="margin-bottom: 15px"></el-alert>
+    </div>
+    <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 {
+  data() {
+    return {
+      platform: {},
+      form: {},
+      rules: {
+        money: [{ required: true, message: '充值金额不能为空', trigger: 'blur' }],
+        certificate: [{ required: true, message: '充值凭证不能为空', trigger: 'blur' }]
+      }
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    this.ajax({ url: '/work/platform/detail' }).then((response) => {
+      this.platform = response.data;
+    });
+    if (this.param.id) {
+      this.ajax({ url: '/work/recharge/detail/' + this.param.id }).then((response) => {
+        this.form = response.data;
+      });
+    }
+  },
+  methods: {
+    submitForm() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.form.id) {
+            this.ajax({ method: 'post', url: '/work/recharge/edit', data: this.form }).then((response) => {
+              this.$modal.msgSuccess('修改成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          } else {
+            this.ajax({ method: 'post', url: '/work/recharge/add', data: this.form }).then((response) => {
+              this.$modal.msgSuccess('提交成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          }
+        }
+      });
+    }
+  }
+};
+</script>

+ 126 - 0
admin-ui/src/views/work/money/recharge/index.vue

@@ -0,0 +1,126 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch">
+      <el-form-item label="充值企业" prop="companyName">
+        <el-input v-model="queryParams.companyName" placeholder="请输入充值企业" @keyup.enter.native="handleQuery" clearable />
+      </el-form-item>
+      <el-form-item label="充值编号" prop="nums">
+        <el-input v-model="queryParams.nums" placeholder="请输入充值编号" @keyup.enter.native="handleQuery" class="inp" clearable />
+      </el-form-item>
+      <el-form-item label="充值状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="充值状态" clearable style="width: 117px">
+          <el-option value="0" label="待确认"></el-option>
+          <el-option value="1" label="已确认"></el-option>
+          <el-option value="2" label="充值无效"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="时间范围">
+        <el-date-picker v-model="dateRange" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+      </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-row :gutter="10" class="mb8">
+      <el-button type="success" icon="el-icon-edit" :disabled="ids.length != 1" @click="op('edit', ids)" v-hasPermi="['work:recharge:edit']">审核</el-button>
+      <el-button type="danger" icon="el-icon-delete" :disabled="ids.length == 0" @click="del" v-hasPermi="['work:recharge:remove']">删除{{ ids.length > 0 ? '(' + ids.length + ')' : '' }}</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-column label="充值企业" align="left" prop="companyName" />
+      <el-table-column label="充值编号" align="center" prop="nums" width="170" />
+      <el-table-column label="充值金额(元)" align="center" prop="money" width="130" />
+      <el-table-column label="充值状态" align="center" width="110">
+        <template slot-scope="scope">
+          <el-tag type="danger" v-if="scope.row.state == 0">待确认</el-tag>
+          <el-tag type="success" v-if="scope.row.state == 1">已确认</el-tag>
+          <el-popover placement="top-start" v-if="scope.row.state == 2" title="原因" width="200" trigger="hover" :content="scope.row.msg">
+            <el-tag type="danger" slot="reference">充值无效</el-tag>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="申请日期" align="center" prop="createTime" width="170" />
+      <el-table-column label="申请人" align="center" prop="opBy" width="130" />
+      <el-table-column label="操作" align="center" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:recharge:list']">查看</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:recharge:edit']" :disabled="scope.row.state != 0">审核</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:recharge:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+      <template slot="empty">
+        <el-empty></el-empty>
+      </template>
+    </el-table>
+    <pagination v-if="response.total > 0" :total="response.total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+<script>
+import audit from './audit';
+export default {
+  name: 'Recharge',
+  data() {
+    return {
+      ids: [],
+      showSearch: true,
+      response: {},
+      dateRange: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyName: null,
+        state: null,
+        nums: null,
+        orderByColumn: 'r.id',
+        isAsc: 'desc'
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      if (this.dateRange) {
+        this.queryParams.dateBegin = this.dateRange[0];
+        this.queryParams.dateEnd = this.dateRange[1];
+      }
+      this.ajax({ url: '/work/recharge/list', data: this.queryParams }).then((response) => {
+        this.response = response;
+      });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm('queryForm');
+      this.dateRange = [];
+      this.handleQuery();
+    },
+    selects(rows) {
+      this.ids = rows.map((item) => item.id);
+    },
+    op(tag, row) {
+      if (tag == 'detail') {
+        const id = row.id || this.ids[0];
+        this.iframe({ obj: audit, param: { id: id, detail: true }, title: '充值详情', width: '45%', height: '65%' });
+      }
+      if (tag == 'edit') {
+        const id = row.id || this.ids[0];
+        this.iframe({ obj: audit, param: { id: id }, title: '充值确认', width: '45%', height: '65%' });
+      }
+    },
+    del(row) {
+      this.$confirm('是否确认删除选中数据?', '警告', { type: 'warning' }).then(() => {
+        this.get({ url: '/work/recharge/remove/' + (row.id || this.ids) }).then((response) => {
+          this.$modal.msgSuccess('删除成功');
+          this.getList();
+        });
+      });
+    }
+  }
+};
+</script>

+ 88 - 0
admin-ui/src/views/work/money/recharge/record.vue

@@ -0,0 +1,88 @@
+<template>
+  <div class="cmain">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch">
+      <el-form-item label="充值编号" prop="nums">
+        <el-input v-model="queryParams.nums" placeholder="请输入充值编号" @keyup.enter.native="handleQuery" class="inp" clearable />
+      </el-form-item>
+      <el-form-item label="充值状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="充值状态" clearable style="width: 117px">
+          <el-option value="0" label="待确认"></el-option>
+          <el-option value="1" label="已确认"></el-option>
+          <el-option value="2" label="充值无效"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="时间范围">
+        <el-date-picker v-model="dateRange" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+      </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 height="calc(100vh - 270px)">
+      <el-table-column label="充值金额(元)" align="center" prop="money"/>
+      <el-table-column label="充值编号" align="center" prop="nums"/>
+      <el-table-column label="充值状态" align="center" width="110">
+        <template slot-scope="scope">
+          <el-tag type="danger" v-if="scope.row.state == 0">待确认</el-tag>
+          <el-tag type="success" v-if="scope.row.state == 1">已确认</el-tag>
+          <el-popover placement="top-start" v-if="scope.row.state == 2" title="原因" width="200" trigger="hover" :content="scope.row.msg">
+            <el-tag type="danger" slot="reference">充值无效</el-tag>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="申请日期" align="center" prop="createTime"/>
+      <el-table-column label="申请人" align="center" prop="opBy" width="130" />
+      <template slot="empty">
+        <el-empty></el-empty>
+      </template>
+    </el-table>
+    <pagination v-if="response.total > 0" :total="response.total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+<script>
+import audit from './audit';
+export default {
+  name: 'Recharge',
+  data() {
+    return {
+      ids: [],
+      showSearch: true,
+      response: {},
+      dateRange: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyName: null,
+        state: null,
+        nums: null,
+        orderByColumn: 'r.id',
+        isAsc: 'desc'
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      if (this.dateRange) {
+        this.queryParams.dateBegin = this.dateRange[0];
+        this.queryParams.dateEnd = this.dateRange[1];
+      }
+      this.ajax({ url: '/work/recharge/list', data: this.queryParams }).then((response) => {
+        this.response = response;
+      });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm('queryForm');
+      this.dateRange = [];
+      this.handleQuery();
+    }
+  }
+};
+</script>

+ 9 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/CompanyController.java

@@ -41,11 +41,18 @@ public class CompanyController extends BaseController {
         return getDataTable(list);
     }
 
+    @PreAuthorize("@ss.hasPermi('work:money:index')")
+    @GetMapping("/index")
+    public AjaxResult index() {
+        Company company = companyService.getById(getLoginUser().getUser().getCompanyId());
+        return AjaxResult.success(company);
+    }
+
     @PreAuthorize("@ss.hasPermi('work:company:query')")
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id) {
-        Company company= companyService.getById(id);
-        SysUser user=userService.selectUserByCompanyId(id);
+        Company company = companyService.getById(id);
+        SysUser user = userService.selectUserByCompanyId(id);
         company.setUserName(user.getUserName());
         company.setPassword(user.getPassword());
         return AjaxResult.success(company);

+ 0 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PlatformController.java

@@ -26,7 +26,6 @@ public class PlatformController extends BaseController {
     @Autowired
     private RedisCache redisCache;
 
-    @PreAuthorize("@ss.hasPermi('work:platform:query')")
     @GetMapping(value = "/detail")
     public AjaxResult detail(){
         return AjaxResult.success(platformService.getById(1));

+ 71 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/RechargeController.java

@@ -0,0 +1,71 @@
+package com.ruoyi.web.work.controller;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.work.domain.Recharge;
+import com.ruoyi.web.work.domain.dto.RechargeDto;
+import com.ruoyi.web.work.service.IRechargeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.rmi.ServerException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 充值管理
+ *
+ * @author lsw
+ * @date 2024-04-17
+ */
+@RestController
+@RequestMapping("/work/recharge")
+public class RechargeController extends BaseController {
+    @Autowired
+    private IRechargeService rechargeService;
+
+    @PreAuthorize("@ss.hasPermi('work:recharge:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(Recharge recharge) {
+        if (getLoginUser().getUser().getType() == 1) {
+            recharge.setCompanyId(getLoginUser().getUser().getCompanyId());
+        }
+        startPage();
+        List<Recharge> list = rechargeService.selectList(recharge);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:recharge:query')")
+    @GetMapping(value = "/detail/{id}")
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        return AjaxResult.success(rechargeService.getById(id));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:recharge:add')")
+    @Log(title = "充值管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @RepeatSubmit
+    public AjaxResult add(@Validated @RequestBody Recharge recharge) {
+        return rechargeService.add(recharge);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:recharge:edit')")
+    @Log(title = "充值管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody RechargeDto dto) throws ServerException {
+        return rechargeService.edit(dto);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:recharge:remove')")
+    @Log(title = "充值管理", businessType = BusinessType.DELETE)
+    @GetMapping("/remove/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(rechargeService.removeByIds(Arrays.asList(ids)));
+    }
+}

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Company.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.math.BigDecimal;
 import java.util.Date;
 /**
  * @author lsw
@@ -42,6 +43,9 @@ public class Company{
     @ApiModelProperty(value = "对公账号")
     private String bankAccount;
 
+    @ApiModelProperty(value = "余额")
+    private BigDecimal money;
+
     @ApiModelProperty(value = "开户许可证照片")
     private String b1;
 

+ 82 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Recharge.java

@@ -0,0 +1,82 @@
+package com.ruoyi.web.work.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-04-17
+ */
+@Data
+@TableName(value = "tb_recharge")
+@Accessors(chain = true)
+public class Recharge {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "关联企业")
+    private Long companyId;
+
+    @ApiModelProperty(value = "充值人id")
+    private Long userId;
+
+    @ApiModelProperty(value = "充值编号")
+    private String nums;
+
+    @NotNull(message = "充值金额不能为空")
+    @DecimalMin(value = "1", inclusive = false, message = "充值金额不能小于1")
+    @ApiModelProperty(value = "充值金额")
+    private BigDecimal money;
+
+    @NotBlank(message = "充值凭证不能为空")
+    @ApiModelProperty(value = "充值凭证")
+    private String certificate;
+
+    @ApiModelProperty(value = "状态:0=正常,1=停用")
+    private Integer state;
+
+    @ApiModelProperty(value = "充值无效原因")
+    private String msg;
+
+    @Version
+    private String version;
+
+    private String opBy;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateBy;
+
+    @TableField(fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "企业名称")
+    @TableField(exist = false)
+    private String companyName;
+
+    //开始日期
+    @TableField(exist = false)
+    private String dateBegin;
+
+    //结束日期
+    @TableField(exist = false)
+    private String dateEnd;
+
+}

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/RechargeDto.java

@@ -0,0 +1,22 @@
+package com.ruoyi.web.work.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class RechargeDto {
+
+
+    @NotNull(message = "参数错误")
+    private Long id;
+
+    @NotNull(message = "参数错误")
+    @Min(value = 1, message = "state 只能是 1 或者 2")
+    @Max(value = 2, message = "state 只能是 1 或者 2")
+    private Integer state;
+
+    private String msg;
+}

+ 13 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/RechargeMapper.java

@@ -0,0 +1,13 @@
+package com.ruoyi.web.work.mapper;
+
+import java.util.List;
+import com.ruoyi.web.work.domain.Recharge;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author lsw
+ * @date 2024-04-17
+ */
+public interface RechargeMapper extends BaseMapper<Recharge> {
+    List<Recharge> selectList(Recharge recharge);
+}

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IRechargeService.java

@@ -0,0 +1,21 @@
+package com.ruoyi.web.work.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.work.domain.Recharge;
+import com.ruoyi.web.work.domain.dto.RechargeDto;
+
+import java.rmi.ServerException;
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-17
+ */
+public interface IRechargeService extends IService<Recharge>{
+    List<Recharge> selectList(Recharge recharge);
+
+    AjaxResult add(Recharge recharge);
+
+    AjaxResult edit(RechargeDto dto) throws ServerException;
+}

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/CompanyServiceImpl.java

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.rmi.ServerException;
 import java.util.List;
 
@@ -40,6 +41,8 @@ public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> impl
         if (bean != null) {
             return AjaxResult.error("该企业已存在");
         }
+        company.setMoney(BigDecimal.ZERO);
+        company.setState(0);
         save(company);
         SysUser user = new SysUser();
         user.setUserName(company.getUserName());

+ 72 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/RechargeServiceImpl.java

@@ -0,0 +1,72 @@
+package com.ruoyi.web.work.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.web.work.domain.Company;
+import com.ruoyi.web.work.domain.Recharge;
+import com.ruoyi.web.work.domain.dto.RechargeDto;
+import com.ruoyi.web.work.mapper.RechargeMapper;
+import com.ruoyi.web.work.service.ICompanyService;
+import com.ruoyi.web.work.service.IRechargeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.rmi.ServerException;
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-17
+ */
+@Service
+public class RechargeServiceImpl extends ServiceImpl<RechargeMapper, Recharge> implements IRechargeService {
+    @Autowired
+    private RechargeMapper rechargeMapper;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Override
+    public List<Recharge> selectList(Recharge recharge) {
+        return rechargeMapper.selectList(recharge);
+    }
+
+    @Override
+    public AjaxResult add(Recharge recharge) {
+        recharge.setCompanyId(SecurityUtils.getLoginUser().getUser().getCompanyId());
+        recharge.setOpBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        recharge.setUserId(SecurityUtils.getLoginUser().getUser().getUserId());
+        recharge.setNums(StringUtils.generateNumber());
+        recharge.setState(0);
+        save(recharge);
+        return AjaxResult.success();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public AjaxResult edit(RechargeDto dto) throws ServerException {
+        Recharge recharge = getById(dto.getId());
+        if (recharge == null) {
+            return AjaxResult.error("充值对象不存在");
+        }
+        if (recharge.getState() != 0) {
+            return AjaxResult.error("不可重复操作");
+        }
+        recharge.setState(dto.getState());
+        recharge.setMsg(dto.getMsg());
+        updateById(recharge);
+        //审核确认
+        if (recharge.getState() == 1) {
+            Company company = companyService.getById(recharge.getCompanyId());
+            if (company == null) {
+                throw new ServerException("关联企业不存在");
+            }
+            company.setMoney(company.getMoney().add(recharge.getMoney()));
+            companyService.updateById(company);
+        }
+        return AjaxResult.success();
+    }
+}

+ 23 - 0
ruoyi-admin/src/main/resources/mapper/work/RechargeMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.work.mapper.RechargeMapper">
+    
+    <select id="selectList" resultType="com.ruoyi.web.work.domain.Recharge">
+        SELECT
+        r.*,
+        c.company_name
+        FROM
+        tb_recharge r
+        LEFT JOIN tb_company c ON c.id = r.company_id
+        <where>
+            <if test="companyName != null  and companyName != ''"> and c.company_name like concat('%', #{companyName}, '%')</if>
+            <if test="nums != null  and nums != ''"> and r.nums like concat('%', #{nums}, '%')</if>
+            <if test="companyId != null "> and r.company_id = #{companyId}</if>
+            <if test="state != null "> and r.state = #{state}</if>
+            <if test="dateBegin != null  and dateBegin != ''"> AND r.create_time BETWEEN #{dateBegin} AND #{dateEnd} + INTERVAL 1 DAY</if>
+        </where>
+    </select>
+
+</mapper>