lsw 1 yıl önce
ebeveyn
işleme
ca08bf7ae8
25 değiştirilmiş dosya ile 723 ekleme ve 219 silme
  1. 3 0
      admin-ui/src/assets/styles/extend.scss
  2. 45 0
      admin-ui/src/components/qr.vue
  3. 11 11
      admin-ui/src/views/work/company/edit.vue
  4. 11 6
      admin-ui/src/views/work/company/index.vue
  5. 7 1
      admin-ui/src/views/work/money/index.vue
  6. 91 0
      admin-ui/src/views/work/money/out/audit.vue
  7. 111 0
      admin-ui/src/views/work/money/out/edit.vue
  8. 122 0
      admin-ui/src/views/work/money/out/index.vue
  9. 4 4
      admin-ui/src/views/work/money/recharge/audit.vue
  10. 8 8
      admin-ui/src/views/work/money/recharge/edit.vue
  11. 1 1
      admin-ui/src/views/work/money/recharge/index.vue
  12. 0 4
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/CompanyController.java
  13. 75 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/MoneyOutController.java
  14. 0 66
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/NoticeController.java
  15. 77 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/MoneyOut.java
  16. 0 50
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Notice.java
  17. 22 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/MoneyOutDto.java
  18. 13 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/MoneyOutMapper.java
  19. 0 14
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/NoticeMapper.java
  20. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IMoneyOutService.java
  21. 0 13
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/INoticeService.java
  22. 78 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/MoneyOutServiceImpl.java
  23. 0 24
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/NoticeServiceImpl.java
  24. 23 0
      ruoyi-admin/src/main/resources/mapper/work/MoneyOutMapper.xml
  25. 0 17
      ruoyi-admin/src/main/resources/mapper/work/NoticeMapper.xml

+ 3 - 0
admin-ui/src/assets/styles/extend.scss

@@ -338,3 +338,6 @@
 .cg{
   margin-bottom: 15px
 }
+.yzm{
+  color:#1890ff;
+}

+ 45 - 0
admin-ui/src/components/qr.vue

@@ -0,0 +1,45 @@
+<template>
+	<div>
+
+	</div>
+</template>
+
+<script>
+import QRCode from 'qrcodejs2';
+export default {
+	props: {
+		item: {
+			type: Object,
+			default: {}
+		},
+		fixed_number: {
+			type: Array,
+			default: () => [6, 4.5]
+		}
+	},
+	data() {
+		return {
+			open: false,
+			visible: false, //是否显示cropper
+		};
+	},
+	methods: {
+		editCropper(data) {
+			this.open = true;
+			this.visible = true;
+			this.options.img = data;
+		},
+		// 向左旋转
+		rotateLeft() {
+			this.$refs.cropper.rotateLeft();
+		},
+		// 向右旋转
+		rotateRight() {
+			this.$refs.cropper.rotateRight();
+		},
+	}
+};
+</script>
+<style lang="scss">
+
+</style>

+ 11 - 11
admin-ui/src/views/work/company/edit.vue

@@ -9,29 +9,29 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="企业名称" prop="companyName">
-              <el-input v-model="form.companyName" placeholder="请输入企业名称" clearable />
+              <el-input v-model="form.companyName" placeholder="请输入企业名称" :disabled="param.detail" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="企业负责人" prop="director">
-              <el-input v-model="form.director" placeholder="请输入企业方负责人" clearable />
+              <el-input v-model="form.director" placeholder="请输入企业方负责人" clearable :disabled="param.detail" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="手机号" prop="phone">
-              <el-input v-model="form.phone" placeholder="请输入手机号" clearable />
+              <el-input v-model="form.phone" placeholder="请输入手机号" clearable :disabled="param.detail" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="联系地址" prop="address">
-              <el-input v-model="form.address" placeholder="请输入联系地址" clearable />
+              <el-input v-model="form.address" placeholder="请输入联系地址" clearable :disabled="param.detail" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item label="营业执照" prop="business">
-          <ImageUpload v-model="form.business" :isShowTip="false"></ImageUpload>
+          <ImageUpload v-model="form.business" :isShowTip="false" :limit="1"></ImageUpload>
         </el-form-item>
       </div>
       <div class="bos">
@@ -40,16 +40,16 @@
           <div class="tit">对公账户信息</div>
         </div>
         <el-form-item label="开户行" prop="bankName">
-          <el-input v-model="form.bankName" placeholder="请输入开户行" clearable />
+          <el-input v-model="form.bankName" placeholder="请输入开户行" clearable :disabled="param.detail" />
         </el-form-item>
         <el-form-item label="对公账号" prop="bankAccount">
-          <el-input v-model="form.bankAccount" placeholder="请输入对公账号" clearable />
+          <el-input v-model="form.bankAccount" placeholder="请输入对公账号" clearable :disabled="param.detail" />
         </el-form-item>
         <el-form-item label="开户许可证" prop="b1">
-          <ImageUpload v-model="form.b1" :isShowTip="false"></ImageUpload>
+          <ImageUpload v-model="form.b1" :isShowTip="false" :limit="1"></ImageUpload>
         </el-form-item>
       </div>
-      <div class="bos">
+      <div class="bos" v-if="!form.id">
         <div class="lab">
           <div class="bsg"></div>
           <div class="tit">
@@ -71,7 +71,7 @@
         </el-row>
       </div>
     </el-form>
-    <div class="mfooter">
+    <div class="mfooter" v-if="!param.detail">
       <el-button type="primary" @click="submitForm">确 定</el-button>
       <el-button @click="$layer.close(layerid)">取 消</el-button>
     </div>
@@ -82,7 +82,7 @@
 export default {
   data() {
     return {
-      form: {password:123456},
+      form: { password: 123456 },
       rules: {
         companyName: [{ required: true, message: '不能为空', trigger: 'blur' }],
         director: [{ required: true, message: '不能为空', trigger: 'blur' }],

+ 11 - 6
admin-ui/src/views/work/company/index.vue

@@ -2,7 +2,7 @@
   <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-input v-model="queryParams.companyName" placeholder="请输入企业名称" @keyup.enter.native="handleQuery" clearable />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@@ -17,9 +17,10 @@
     </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="center" prop="companyName" width="250"/>
+      <el-table-column label="企业名称" align="center" prop="companyName" width="250" />
       <el-table-column label="企业方负责人" align="center" prop="director" />
       <el-table-column label="手机号" align="center" prop="phone" />
+      <el-table-column label="账户余额(元)" align="center" prop="money" />
       <el-table-column label="创建日期" align="center" prop="createTime" />
       <el-table-column label="账号状态" align="center" prop="state" width="100">
         <template slot-scope="scope">
@@ -30,8 +31,9 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <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:company:list']">查看</el-button>
           <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:company:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:company:remove']">删除</el-button>
         </template>
@@ -87,11 +89,14 @@ export default {
     },
     op(tag, row) {
       if (tag == 'add') {
-        this.iframe({ obj: edit, param: {}, title: '新增企业', width: '60%', height: '93%' });
+        this.iframe({ obj: edit, param: {}, title: '新增企业', width: '60%', height: '85%' });
+      }
+      const id = row.id || this.ids[0];
+      if (tag == 'detail') {
+        this.iframe({ obj: edit, param: { id: id, detail: true }, title: '查看企业信息', width: '60%', height: '75%' });
       }
       if (tag == 'edit') {
-        const id = row.id || this.ids[0];
-        this.iframe({ obj: edit, param: { id: id }, title: '编辑企业', width: '60%', height: '93%' });
+        this.iframe({ obj: edit, param: { id: id }, title: '编辑企业', width: '60%', height: '80%' });
       }
       //账号状态
       if (tag == 'change') {

+ 7 - 1
admin-ui/src/views/work/money/index.vue

@@ -10,9 +10,10 @@
         <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-minus" @click="op('out')" v-hasPermi="['work:out: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-button type="primary" icon="el-icon-s-promotion" @click="op('recharge_list')" v-hasPermi="['work:recharge:list']">提现明细</el-button>
         </el-row>
       </div>
     </div>
@@ -20,6 +21,8 @@
 </template>
 
 <script>
+import out_edit from './out/edit.vue';
+import out_list from './out/edit.vue';
 import recharge_edit from './recharge/edit.vue';
 import recharge_list from './recharge/record.vue';
 import rz from '@/assets/images/rz.png';
@@ -43,6 +46,9 @@ export default {
   },
   methods: {
     op(tag, row) {
+      if (tag == 'out') {
+        this.iframe({ obj: out_edit, param: {}, title: '提现申请', width: '40%', height: '55%' });
+      }
       if (tag == 'add') {
         this.iframe({ obj: recharge_edit, param: {}, title: '充值申请', width: '40%', height: '65%' });
       }

+ 91 - 0
admin-ui/src/views/work/money/out/audit.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="cmain">
+    <div class="bos">
+      <div class="lab">
+        <div class="bsg"></div>
+        <div class="tit">提现账户信息</div>
+      </div>
+      <el-form ref="company" :model="company" label-width="100px">
+        <el-form-item label="开户银行">
+          <el-input v-model="company.bankName" disabled />
+        </el-form-item>
+        <el-form-item label="银行账户">
+          <el-input v-model="company.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>
+            <template slot="append">账户余额:{{ company.money }}</template>
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <el-form-item label="申请人">
+        <el-input v-model="company.bankAccount" disabled />
+      </el-form-item>
+    </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 {
+      company: {},
+      form: {},
+      rules: {
+        money: [{ required: true, message: '提现金额不能为空', trigger: 'blur' }]
+      }
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    if (this.param.id) {
+      this.ajax({ url: '/work/out/detail/' + this.param.id }).then((response) => {
+        this.form = response.data;
+        this.company = response.data.company;
+      });
+    }
+  },
+  methods: {
+    submitForm(state) {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$prompt(state == 1 ? '确认提现' + this.form.money + '元到 ' + this.company.companyName + ' 银行账户? 该操作不可撤销!' : '确认无效提现', {
+            type: 'warning',
+            showInput: state == 1 ? false : true,
+            inputType: 'textarea',
+            inputPlaceholder: '无效原因',
+            inputValidator: (value) => {
+              if (!value && state == 2) {
+                return '请输入无效原因';
+              }
+            }
+          }).then(({ value }) => {
+            this.post({ url: '/work/out/edit', data: { id: this.form.id, state: state, msg: value } }).then((response) => {
+              this.$modal.msgSuccess('操作成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          });
+        }
+      });
+    }
+  }
+};
+</script>

+ 111 - 0
admin-ui/src/views/work/money/out/edit.vue

@@ -0,0 +1,111 @@
+<template>
+  <div class="cmain">
+    <div class="bos">
+      <el-steps :active="1" align-center class="cg">
+        <el-step title="提现信息"></el-step>
+        <el-step title="平台确认"></el-step>
+        <el-step title="提现到账"></el-step>
+      </el-steps>
+      <el-form ref="company" :model="company" label-width="100px">
+        <el-form-item label="开户行">
+          <el-input v-model="company.bankName" disabled />
+        </el-form-item>
+        <el-form-item label="银行账户">
+          <el-input v-model="company.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>
+            <template slot="append">账户余额:{{ company.money }}</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="手机号码">
+          <el-input type="number" v-model="company.phone" disabled>
+            <template slot="append">
+              <span @click="getCode()" class="yzm">{{ msg }}</span>
+            </template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="短信验证码" prop="code">
+          <el-input type="number" v-model="form.code" />
+        </el-form-item>
+      </el-form>
+    </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 {
+      msg: '获取验证码',
+      time: 60,
+      flag: true,
+      company: {},
+      form: {},
+      rules: {
+        money: [{ required: true, message: '提现金额不能为空', trigger: 'blur' }],
+        code: [{ required: true, message: '验证码不能为空', trigger: 'blur' }]
+      }
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    this.ajax({ url: '/work/company/index' }).then((response) => {
+      this.company = response.data;
+    });
+    if (this.param.id) {
+      this.ajax({ url: '/work/out/detail/' + this.param.id }).then((response) => {
+        this.form = response.data;
+      });
+    }
+  },
+  methods: {
+    getCode() {
+      if (!this.flag) {
+        return;
+      }
+      this.$modal.msgSuccess('你的验证码是123456');
+      //一分钟倒计时
+      var countdown = setInterval(() => {
+        this.time--;
+        if (this.time == 0) {
+          this.flag = true;
+          this.msg = '获取短信';
+          this.time = 60;
+          clearInterval(countdown);
+        } else {
+          this.flag = false;
+          this.msg = '重新获取(' + this.time + ')';
+        }
+      }, 1000);
+    },
+    submitForm() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.ajax({ method: 'post', url: '/work/out/add', data: this.form }).then((response) => {
+            this.$modal.msgSuccess('申请成功');
+            this.$layer.close(this.layerid);
+            this.$parent.getList();
+          });
+        }
+      });
+    }
+  }
+};
+</script>

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

@@ -0,0 +1,122 @@
+<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:out:edit']">审核</el-button>
+      <el-button type="danger" icon="el-icon-delete" :disabled="ids.length == 0" @click="del" v-hasPermi="['work:out: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:out:list']">查看</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:out: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:out: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: 'Out',
+  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/out/list', data: this.queryParams }).then((response) => {
+        this.response = response;
+      });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm('queryForm');
+      this.handleQuery();
+    },
+    selects(rows) {
+      this.ids = rows.map((item) => item.id);
+    },
+    op(tag, row) {
+      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/out/remove/' + (row.id || this.ids) }).then((response) => {
+          this.$modal.msgSuccess('删除成功');
+          this.getList();
+        });
+      });
+    }
+  }
+};
+</script>

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

@@ -5,7 +5,7 @@
         <div class="bsg"></div>
         <div class="tit">充值账户信息</div>
       </div>
-      <el-form ref="platform" :model="platform" label-width="100px">
+      <el-form ref="platform" :model="platform" label-width="120px">
         <el-form-item label="服务公司名称">
           <el-input v-model="platform.serviceCompany" disabled />
         </el-form-item>
@@ -16,7 +16,7 @@
           <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 ref="form" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="充值金额" prop="money">
           <el-input type="number" v-model="form.money" disabled />
         </el-form-item>
@@ -69,10 +69,10 @@ export default {
     submitForm(state) {
       this.$refs['form'].validate((valid) => {
         if (valid) {
-          this.$prompt(state == 1 ? '确认充值?' : '确认无效充值', {
+          this.$prompt(state == 1 ? '确认充值' + this.form.money + '元到 ' + this.param.companyName + ' 账户? 该操作不可撤销!' : '确认无效充值', {
             type: 'warning',
             showInput: state == 1 ? false : true,
-            inputType: 'text',
+            inputType: 'textarea',
             inputPlaceholder: '无效原因',
             inputValidator: (value) => {
               if (!value && state == 2) {

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

@@ -1,22 +1,23 @@
 <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 ref="platform" :model="platform" label-width="120px">
+        <el-steps :active="1" align-center class="cg">
+          <el-step title="充值信息"></el-step>
+          <el-step title="平台确认"></el-step>
+          <el-step title="余额到账"></el-step>
+        </el-steps>
         <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-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 ref="form" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="充值金额" prop="money">
           <el-input type="number" v-model="form.money" placeholder="请输入充值金额" clearable />
         </el-form-item>
@@ -25,7 +26,6 @@
           <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>

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

@@ -110,7 +110,7 @@ export default {
       }
       if (tag == 'edit') {
         const id = row.id || this.ids[0];
-        this.iframe({ obj: audit, param: { id: id }, title: '充值确认', width: '45%', height: '65%' });
+        this.iframe({ obj: audit, param: { id: id, companyName: row.companyName }, title: '充值确认', width: '45%', height: '65%' });
       }
     },
     del(row) {

+ 0 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/CompanyController.java

@@ -3,7 +3,6 @@ package com.ruoyi.web.work.controller;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.system.service.ISysUserService;
@@ -52,9 +51,6 @@ public class CompanyController extends BaseController {
     @GetMapping(value = "/detail/{id}")
     public AjaxResult detail(@PathVariable("id") Long id) {
         Company company = companyService.getById(id);
-        SysUser user = userService.selectUserByCompanyId(id);
-        company.setUserName(user.getUserName());
-        company.setPassword(user.getPassword());
         return AjaxResult.success(company);
     }
 

+ 75 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/MoneyOutController.java

@@ -0,0 +1,75 @@
+package com.ruoyi.web.work.controller;
+
+import com.ruoyi.common.annotation.Log;
+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.MoneyOut;
+import com.ruoyi.web.work.domain.dto.MoneyOutDto;
+import com.ruoyi.web.work.service.ICompanyService;
+import com.ruoyi.web.work.service.IMoneyOutService;
+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-18
+ */
+@RestController
+@RequestMapping("/work/out")
+public class MoneyOutController extends BaseController {
+    @Autowired
+    private IMoneyOutService moneyOutService;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @PreAuthorize("@ss.hasPermi('work:out:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(MoneyOut moneyOut) {
+        if (getLoginUser().getUser().getType() == 1) {
+            moneyOut.setCompanyId(getLoginUser().getUser().getCompanyId());
+        }
+        startPage();
+        List<MoneyOut> list = moneyOutService.selectList(moneyOut);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:out:query')")
+    @GetMapping(value = "/detail/{id}")
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        MoneyOut out = moneyOutService.getById(id);
+        out.setCompany(companyService.getById(out.getCompanyId()));
+        return AjaxResult.success(out);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:out:add')")
+    @Log(title = "提现管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@Validated @RequestBody MoneyOut moneyOut) {
+        return moneyOutService.add(moneyOut);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:out:edit')")
+    @Log(title = "提现管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody MoneyOutDto dto) throws ServerException {
+        return moneyOutService.edit(dto);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:out:remove')")
+    @Log(title = "提现管理", businessType = BusinessType.DELETE)
+    @GetMapping("/remove/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(moneyOutService.removeByIds(Arrays.asList(ids)));
+    }
+}

+ 0 - 66
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/NoticeController.java

@@ -1,66 +0,0 @@
-package com.ruoyi.web.work.controller;
-
-import java.util.Arrays;
-import java.util.List;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.web.work.domain.Notice;
-import com.ruoyi.web.work.service.INoticeService;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 通知公告
- * @author lsw
- * @date 2024-04-15
- */
-@RestController
-@RequestMapping("/work/notice")
-public class NoticeController extends BaseController {
-    @Autowired
-    private INoticeService noticeService;
-
-    @PreAuthorize("@ss.hasPermi('work:notice:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(Notice notice){
-        startPage();
-        List<Notice> list = noticeService.selectList(notice);
-        return getDataTable(list);
-    }
-
-    @PreAuthorize("@ss.hasPermi('work:notice:query')")
-    @GetMapping(value = "/detail/{id}")
-    public AjaxResult detail(@PathVariable("id") Long id){
-        return AjaxResult.success(noticeService.getById(id));
-    }
-
-    @PreAuthorize("@ss.hasPermi('work:notice:add')")
-    @Log(title = "通知公告", businessType = BusinessType.INSERT)
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody Notice notice){
-        return toAjax(noticeService.save(notice));
-    }
-
-    @PreAuthorize("@ss.hasPermi('work:notice:edit')")
-    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
-    @PostMapping("/edit")
-    public AjaxResult edit(@RequestBody Notice notice){
-        return toAjax(noticeService.updateById(notice));
-    }
-
-    @PreAuthorize("@ss.hasPermi('work:notice:remove')")
-    @Log(title = "通知公告", businessType = BusinessType.DELETE)
-    @GetMapping("/remove/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids){
-        return toAjax(noticeService.removeByIds(Arrays.asList(ids)));
-    }
-}

+ 77 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/MoneyOut.java

@@ -0,0 +1,77 @@
+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.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.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+/**
+ * @author lsw
+ * @date 2024-04-18
+ */
+@Data
+@TableName(value = "tb_money_out")
+@Accessors(chain = true)
+public class MoneyOut{
+    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;
+
+    @ApiModelProperty(value = "状态:0=正常,1=停用")
+    private Integer state;
+
+    @ApiModelProperty(value = "充值无效原因")
+    private String msg;
+
+    private String version;
+
+    @ApiModelProperty(value = "创建者")
+    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;
+
+    @TableField(exist = false)
+    private Company company;
+}

+ 0 - 50
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Notice.java

@@ -1,50 +0,0 @@
-package com.ruoyi.web.work.domain;
-
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import lombok.Data;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.experimental.Accessors;
-/**
- * @author lsw
- * @date 2024-04-15
- */
-@Data
-@TableName(value = "tb_notice")
-@Accessors(chain = true)
-public class Notice{
-    private static final long serialVersionUID = 1L;
-
-    private Long id;
-
-    @ApiModelProperty(value = "标题")
-    private String title;
-
-    @ApiModelProperty(value = "内容")
-    private String contents;
-
-    @ApiModelProperty(value = "是否置顶")
-    private Integer top;
-
-    @ApiModelProperty(value = "状态:0=正常,1=停用")
-    private Integer state;
-
-    @TableField(fill = FieldFill.INSERT)
-    private String createBy;
-
-    @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;
-
-
-}

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/MoneyOutDto.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 MoneyOutDto {
+
+
+    @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/MoneyOutMapper.java

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

+ 0 - 14
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/NoticeMapper.java

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

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IMoneyOutService.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.MoneyOut;
+import com.ruoyi.web.work.domain.dto.MoneyOutDto;
+
+import java.rmi.ServerException;
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-18
+ */
+public interface IMoneyOutService extends IService<MoneyOut>{
+    List<MoneyOut> selectList(MoneyOut moneyOut);
+
+    AjaxResult add(MoneyOut moneyOut);
+
+    AjaxResult edit(MoneyOutDto dto) throws ServerException;
+}

+ 0 - 13
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/INoticeService.java

@@ -1,13 +0,0 @@
-package com.ruoyi.web.work.service;
-
-import java.util.List;
-import com.ruoyi.web.work.domain.Notice;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * @author lsw
- * @date 2024-04-15
- */
-public interface INoticeService extends IService<Notice>{
-    List<Notice> selectList(Notice notice);
-}

+ 78 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/MoneyOutServiceImpl.java

@@ -0,0 +1,78 @@
+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.MoneyOut;
+import com.ruoyi.web.work.domain.dto.MoneyOutDto;
+import com.ruoyi.web.work.mapper.MoneyOutMapper;
+import com.ruoyi.web.work.service.ICompanyService;
+import com.ruoyi.web.work.service.IMoneyOutService;
+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-18
+ */
+@Service
+public class MoneyOutServiceImpl extends ServiceImpl<MoneyOutMapper, MoneyOut> implements IMoneyOutService {
+    @Autowired
+    private MoneyOutMapper moneyOutMapper;
+
+    @Autowired
+    private ICompanyService companyService;
+
+    @Override
+    public List<MoneyOut> selectList(MoneyOut moneyOut) {
+        return moneyOutMapper.selectList(moneyOut);
+    }
+
+    @Override
+    public AjaxResult add(MoneyOut moneyOut) {
+        Company company = companyService.getById(SecurityUtils.getLoginUser().getUser().getCompanyId());
+        if (company == null) {
+            return AjaxResult.error("账户信息不存在");
+        }
+        if (moneyOut.getMoney().compareTo(company.getMoney()) > 0) {
+            return AjaxResult.error("提现金额不能大于账户余额");
+        }
+        moneyOut.setCompanyId(SecurityUtils.getLoginUser().getUser().getCompanyId());
+        moneyOut.setOpBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        moneyOut.setNums(StringUtils.generateNumber());
+        moneyOut.setState(0);
+        save(moneyOut);
+        return AjaxResult.success();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public AjaxResult edit(MoneyOutDto dto) throws ServerException {
+        MoneyOut moneyOut = getById(dto.getId());
+        if (moneyOut == null) {
+            return AjaxResult.error("提现对象不存在");
+        }
+        if (moneyOut.getState() != 0) {
+            return AjaxResult.error("不可重复操作");
+        }
+        moneyOut.setState(dto.getState());
+        moneyOut.setMsg(dto.getMsg());
+        updateById(moneyOut);
+        //审核确认
+        if (moneyOut.getState() == 1) {
+            Company company = companyService.getById(moneyOut.getCompanyId());
+            if (company == null) {
+                throw new ServerException("关联企业不存在");
+            }
+            company.setMoney(company.getMoney().subtract(moneyOut.getMoney()));
+            companyService.updateById(company);
+        }
+        return AjaxResult.success();
+    }
+}

+ 0 - 24
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/NoticeServiceImpl.java

@@ -1,24 +0,0 @@
-package com.ruoyi.web.work.service.impl;
-
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.web.work.mapper.NoticeMapper;
-import com.ruoyi.web.work.domain.Notice;
-import com.ruoyi.web.work.service.INoticeService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
-/**
- * @author lsw
- * @date 2024-04-15
- */
-@Service
-public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements INoticeService {
-    @Autowired
-    private NoticeMapper noticeMapper;
-
-    @Override
-    public List<Notice> selectList(Notice notice) {
-        return noticeMapper.selectList(notice);
-    }
-}

+ 23 - 0
ruoyi-admin/src/main/resources/mapper/work/MoneyOutMapper.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.MoneyOutMapper">
+    
+    <select id="selectList" resultType="com.ruoyi.web.work.domain.MoneyOut">
+        SELECT
+        r.*,
+        c.company_name
+        FROM
+        tb_money_out 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>

+ 0 - 17
ruoyi-admin/src/main/resources/mapper/work/NoticeMapper.xml

@@ -1,17 +0,0 @@
-<?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.NoticeMapper">
-    
-    <select id="selectList" resultType="com.ruoyi.web.work.domain.Notice">
-        select * from tb_notice
-        <where>  
-            <if test="title != null  and title != ''"> and title = #{title}</if>
-            <if test="contents != null  and contents != ''"> and contents = #{contents}</if>
-            <if test="top != null "> and top = #{top}</if>
-            <if test="state != null "> and state = #{state}</if>
-        </where>
-    </select>
-
-</mapper>