lsw 1 year ago
parent
commit
6d3ccc6ee3

+ 3 - 0
admin-ui/package.json

@@ -38,6 +38,8 @@
   "dependencies": {
     "@packy-tang/vue-tinymce": "^1.1.2",
     "@riophae/vue-treeselect": "0.4.0",
+    "@vue-office/docx": "^1.6.1",
+    "@vue/composition-api": "^1.7.2",
     "axios": "0.24.0",
     "clipboard": "2.0.8",
     "core-js": "3.25.2",
@@ -57,6 +59,7 @@
     "sortablejs": "1.10.2",
     "vue": "2.6.12",
     "vue-cropper": "0.5.5",
+    "vue-demi": "^0.14.7",
     "vue-json-excel": "^0.3.0",
     "vue-layer": "^1.2.5",
     "vue-meta": "2.4.0",

+ 1 - 1
admin-ui/src/assets/styles/extend.scss

@@ -324,7 +324,7 @@
 }
 .sfz {
   border-radius: 5px;
-  width: 200px;
+  width: 130px;
 }
 .bs {
   color: darkgray;

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

@@ -27,7 +27,7 @@ import './assets/icons' // icon
 import './permission' // permission control
 import {getDicts} from "@/api/system/dict/data";
 import {getConfigKey} from "@/api/system/config";
-import {parseTime,resetForm,addDateRange,selectDictLabel,selectDictLabels,handleTree,post,get,ajax,iframe,encrypt,decrypt} from "@/utils/ruoyi";
+import {parseTime,resetForm,addDateRange,selectDictLabel,selectDictLabels,handleTree,post,get,ajax,getFile,iframe,encrypt,decrypt} from "@/utils/ruoyi";
 import {checkPermi} from "@/utils/permission"; // 权限判断函数
 // 分页组件
 import Pagination from "@/components/Pagination";
@@ -68,6 +68,7 @@ Vue.prototype.post = post
 Vue.prototype.get = get
 Vue.prototype.ajax = ajax
 Vue.prototype.iframe = iframe
+Vue.prototype.getFile = getFile
 Vue.prototype.util = util;
 Vue.prototype.encrypt = encrypt;
 Vue.prototype.decrypt = decrypt;

+ 13 - 0
admin-ui/src/utils/ruoyi.js

@@ -260,6 +260,19 @@ export function get(opt) {
     params: opt.data
   })
 }
+// get请求
+export function getFile(opt) {
+  opt = opt || {};
+  opt.url = opt.url || '';
+  opt.data = opt.data || null;
+  return request({
+    responseType: 'blob',
+    url: opt.url,
+    method: 'get',
+    params: opt.data
+  })
+}
+
 // 通用请求
 export function ajax(opt) {
   opt = opt || {};

+ 2 - 2
admin-ui/src/views/dashboard/top.vue

@@ -3,7 +3,7 @@
     <span style="font-size: 19px">
       <span>{{ user.nickName }}</span>
       <span class="roleName" v-if="user.roleName">({{ user.roleName }})</span>
-      <span>您好,欢迎使用承揽时代企业端</span>
+      <span>您好,{{title}}</span>
     </span>
     <iframe allowtransparency="true" frameborder="0" width="180" height="36" scrolling="no" style="padding-top: 10px" src="//tianqi.2345.com/plugin/widget/index.htm?s=3&z=2&t=0&v=0&d=2&bd=0&k=&f=#545555&ltf=#545555&htf=ffffff&q=1&e=1&a=1&c=72036&w=180&h=36&align=center"></iframe>
   </div>
@@ -14,7 +14,7 @@ export default {
   props: {
     title: {
       type: String,
-      default: '欢迎使用承揽时代平台端'
+      default: '欢迎使用承揽时代企业端'
     }
   },
   data() {

+ 6 - 108
admin-ui/src/views/index_admin.vue

@@ -1,138 +1,36 @@
 <template>
   <div class="dashboard-editor-container">
-    <div class="mtitle">
-      <span style="font-size: 19px">欢迎使用,{{ user.nickName }}</span>
-      <iframe
-        allowtransparency="true"
-        frameborder="0"
-        width="180"
-        height="36"
-        scrolling="no"
-        style="padding-top: 10px"
-        src="//tianqi.2345.com/plugin/widget/index.htm?s=3&z=2&t=0&v=0&d=2&bd=0&k=&f=#545555&ltf=#545555&htf=ffffff&q=1&e=1&a=1&c=72036&w=180&h=36&align=center"
-      ></iframe>
-    </div>
-    <div class="chart-wrapper">
-      <div class="pop" style="width: 70%">
-        <div class="out">
-          <div class="int">
-            <div class="bos" style="border: 0px">
-              <div class="lab">
-                <div class="bsg"></div>
-                <div class="tit">账户信息</div>
-              </div>
-              <companyInfo></companyInfo>
-            </div>
-          </div>
-        </div>
-        <div class="out">
-          <div class="int">
-            <div class="bos" style="border: 0px">
-              <div class="lab">
-                <div class="bsg"></div>
-                <div class="tit">账户信息</div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="pop" style="width: 30%">
-        <div class="out" style="margin-right: 0px">
-          <div class="int">
-            <div class="bos" style="border: 0px">
-              <div class="lab">
-                <div class="bsg"></div>
-                <div class="tit">用户信息</div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
+    <top title="欢迎使用承揽时代管理端"></top>
   </div>
 </template>
 
 <script>
-import PanelGroup from './dashboard/PanelGroup';
-import BarChart from './dashboard/BarChart';
-import Vue from 'vue';
+import top from '@/views/dashboard/top';
 export default {
   name: 'Index',
   components: {
-    PanelGroup,
-    BarChart
+    top
   },
   data() {
     return {
-      user: this.$store.state.user,
-      data: { count: {}, pass: {} },
-      time: this.util.getDate('times'),
-      chartData1: [], //散货
-      chartData2: [] //集装箱
+      user: this.$store.state.user
     };
   },
-  watch: {
-    deptId(val) {
-      this.getData();
-      this.getWeek();
-    }
-  },
   created() {
     //this.getData();
-    //this.getWeek();
   },
   methods: {
     getData() {
       this.ajax({ url: '/home/index', data: { deptId: this.deptId } }).then((response) => {
         this.data = response.data;
       });
-    },
-    getWeek() {
-      this.chartData1 = [];
-      this.chartData2 = [];
-      this.ajax({ url: '/home/weekSelect', data: { deptId: this.deptId } }).then((response) => {
-        response.data.s.forEach((item) => {
-          this.chartData1.push({ name: item.date, value: ((item.success / item.total) * 100).toFixed(0) });
-        });
-        response.data.j.forEach((item) => {
-          this.chartData2.push({ name: item.date, value: ((item.success / item.total) * 100).toFixed(0) });
-        });
-      });
     }
   }
 };
 </script>
 
 <style lang="scss" scoped>
-.dashboard-editor-container {
-  padding: 15px 20px 0px 20px;
-  .mtitle {
-    margin-bottom: 20px;
-    margin-top: -15px;
-  }
-  .chart-wrapper {
-    margin-top: 12px;
-    overflow: hidden;
-    .pop {
-      float: left;
-      width: 33.33%;
-      overflow: hidden;
-      .out {
-        margin: 10px 10px 20px 0px;
-        .int {
-          box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-          background: white;
-          border-radius: 5px;
-          padding: 15px 15px 10px 15px;
-          overflow: hidden;
-        }
-      }
-    }
-  }
-  .bos {
-    float: left;
-    padding: 0px 10px 0px 10px;
-    width: 100%;
-  }
+.bos {
+  border: 0px;
 }
 </style>

+ 2 - 2
admin-ui/src/views/work/statement/manage/record.vue

@@ -25,9 +25,9 @@
       <el-table-column type="index" label="序号" align="center" width="80" />
       <el-table-column label="姓名" align="center" prop="name" width="100" />
       <el-table-column label="身份证号" align="center" prop="idCard"/>
-      <el-table-column label="手机号" align="center" prop="phone" width="130" />
+      <el-table-column label="手机号" align="center" prop="phone" width="125" />
       <el-table-column label="支付宝账户" align="center" prop="alipay" width="130" />
-      <el-table-column label="流水号" align="center" prop="num" width="170" />
+      <el-table-column label="流水号" align="center" prop="num" width="165" />
       <el-table-column label="结算金额(元)" align="center" prop="money" width="120" />
       <el-table-column label="发放业务费(元)" align="center" prop="realMoney" width="120" />
       <el-table-column label="综合服务费(元)" align="center" prop="serviceMoney" width="120" />

+ 46 - 0
admin-ui/src/views/work/user/contract.vue

@@ -0,0 +1,46 @@
+<template>
+  <div class="cmain">
+    <VueOfficeDocx :src="docx" :options="editorOptions" @rendered="rendered" />
+  </div>
+</template>
+
+<script>
+import VueOfficeDocx from '@vue-office/docx'; //引入VueOfficeDocx组件
+import '@vue-office/docx/lib/index.css';
+export default {
+  components: {
+    VueOfficeDocx
+  },
+  data() {
+    return {
+      docx: '',
+      editorOptions: {
+        toolbar: true,
+        width: '100px',
+        height: '600px'
+      }
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    this.getFile({ url: '/work/user/look', data: { userId: this.param.id } }).then((response) => {
+      this.docx = response;
+    });
+  },
+  methods: {
+    rendered() {
+      console.log('渲染完成');
+    }
+  }
+};
+</script>

+ 35 - 8
admin-ui/src/views/work/user/edit.vue

@@ -47,18 +47,45 @@
           <div class="tit">身份信息</div>
         </div>
         <el-row>
-          <el-col :span="12" style="text-align: center">
-            <el-image :fit="'contain'" class="sfz" :z-index="50000" :src="baseUrl + form.p1" :preview-src-list="[baseUrl + form.p1]"></el-image>
-            <div class="bs">身份证人面像</div>
+          <el-col :span="8">
+            <el-form-item label="性别" prop="sex">
+              <el-input v-model="form.sex" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="民族" prop="nationality">
+              <el-input v-model="form.nationality" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="出生年月" prop="birth">
+              <el-input v-model="form.birth" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="地址" prop="address">
+          <el-input v-model="form.address" disabled />
+        </el-form-item>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="身份证人面像">
+              <el-image :fit="'contain'" class="sfz" :z-index="50000" :src="baseUrl + form.p1" :preview-src-list="[baseUrl + form.p1]"></el-image>
+            </el-form-item>
           </el-col>
-          <el-col :span="12" style="text-align: center">
-            <el-image :fit="'contain'" class="sfz" :z-index="50000" :src="baseUrl + form.p2" :preview-src-list="[baseUrl + form.p2]"></el-image>
-            <div class="bs">身份证人徽面</div>
+          <el-col :span="8">
+            <el-form-item label="身份证人徽面">
+              <el-image :fit="'contain'" class="sfz" :z-index="50000" :src="baseUrl + form.p2" :preview-src-list="[baseUrl + form.p2]"></el-image>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="有效期" prop="endDate">
+              <el-input v-model="form.endDate" disabled />
+            </el-form-item>
           </el-col>
         </el-row>
       </div>
     </el-form>
-    <div class="mfooter">
+    <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>
@@ -96,7 +123,7 @@ export default {
     submitForm(isAuthentication) {
       this.$refs['form'].validate((valid) => {
         if (valid) {
-          this.form.isAuthentication=isAuthentication;
+          this.form.isAuthentication = isAuthentication;
           this.ajax({ method: 'post', url: '/work/user/edit', data: this.form }).then((response) => {
             this.$modal.msgSuccess('操作成功');
             this.$layer.close(this.layerid);

+ 19 - 11
admin-ui/src/views/work/user/index.vue

@@ -16,16 +16,15 @@
       </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:user:edit']">审核</el-button>
       <el-button type="danger" icon="el-icon-delete" :disabled="ids.length == 0" @click="del" v-hasPermi="['work:user: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="center" prop="name" />
+      <el-table-column label="姓名" align="center" prop="name" width="130" />
+      <el-table-column label="性别" align="center" prop="sex" width="80" />
       <el-table-column label="身份证" align="center" prop="idCard" />
-      <el-table-column label="手机号" align="center" prop="phone" />
+      <el-table-column label="手机号" align="center" prop="phone" width="130" />
       <el-table-column label="实名认证" align="center" prop="isAuthentication" width="130">
         <template slot-scope="scope">
           <el-tag type="danger" v-if="scope.row.isAuthentication == 0">未实名</el-tag>
@@ -37,9 +36,10 @@
         <template slot-scope="scope">
           <el-tag type="danger" v-if="scope.row.isContract == 0">未签署</el-tag>
           <el-tag type="success" v-if="scope.row.isContract == 1">已签署</el-tag>
+          <span class="pon" @click="op('contract', scope.row)">查看</span>
         </template>
       </el-table-column>
-      <el-table-column label="关联企业数" align="center" prop="isCompany" width="130" />
+      <el-table-column label="关联企业数" align="center" prop="isCompany" width="120" />
       <el-table-column label="账号状态" align="center" prop="state" width="100">
         <template slot-scope="scope">
           <div class="switch">
@@ -49,11 +49,10 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="注册日期" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center">
+      <el-table-column label="注册日期" align="center" prop="createTime" 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:user:list']">详情</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:user:edit']">审核</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:user:remove']">删除</el-button>
         </template>
       </el-table-column>
@@ -67,10 +66,19 @@
 
 <script>
 import edit from './edit';
+import contract from './contract';
 export default {
   name: 'Users',
   data() {
     return {
+      //设置文档网络地址,可以是相对地址
+      isShowDocx: false,
+      docx: 'https://501351981.github.io/vue-office/examples/dist/static/test-files/test.docx',
+      editorOptions: {
+        toolbar: true,
+        width: '800px',
+        height: '600px'
+      },
       ids: [],
       showSearch: true,
       response: {},
@@ -109,10 +117,10 @@ export default {
     op(tag, row) {
       const id = row.id || this.ids[0];
       if (tag == 'detail') {
-        this.iframe({ obj: audit, param: { id: id, detail: true, companyName: row.companyName }, title: '充值详情', width: '45%', height: '65%' });
+        this.iframe({ obj: edit, param: { id: id, detail: true }, title: '查看详情', width: '55%', height: '60%' });
       }
-      if (tag == 'edit') {
-        this.iframe({ obj: edit, param: { id: id }, title: '审核', width: '60%', height: '70%' });
+      if (tag == 'contract') {
+        this.iframe({ obj: contract, param: { id: id }, title: '查看合同', width: '55%', height: '85%' });
       }
       //账号状态
       if (tag == 'change') {

+ 11 - 4
app/pages/company/search.vue

@@ -1,6 +1,6 @@
 <template>
 	<view>
-		<view class="search"><u-search placeholder="公司名称" v-model="param.companyName" :animation="true" @search="getData()" @clear="clear()"></u-search></view>
+		<view class="search"><u-search placeholder="公司名称" v-model="companyName" :showAction="false" @search="getData()" @clear="clear()"></u-search></view>
 		<view class="list">
 			<view class="item" v-for="(item, index) in list" :key="index" @click="detail(item)">
 				<text>{{ item.companyName }}</text>
@@ -15,14 +15,21 @@ export default {
 	data() {
 		return {
 			list: [],
-			param: {}
+			companyName: ''
 		};
 	},
+	watch: {
+		companyName(val) {
+			if (val.length > 3) {
+				this.getData();
+			}
+		}
+	},
 	methods: {
 		getData() {
 			this.http.request({
 				url: '/app/company/list',
-				data: this.param,
+				data: { companyName: this.companyName },
 				success: (res) => {
 					this.list = res.data.data;
 				}
@@ -36,7 +43,7 @@ export default {
 					if (res.confirm) {
 						this.http.request({
 							url: '/app/relate/add',
-							data: { companyId: item.id,way:'手动关联' },
+							data: { companyId: item.id, way: '手动关联' },
 							method: 'POST',
 							success: (res) => {
 								uni.showModal({

+ 3 - 0
app/pages/index/index.vue

@@ -128,6 +128,9 @@ export default {
 				if (url == 'contract' && this.user.isContract == 1) {
 					this.look();
 				}
+				if (url == 'contract' && this.user.isContract == 0) {
+					this.show = true;
+				}
 			} else {
 				uni.navigateTo({ url: '/pages/user/login' });
 			}

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ContractController.java

@@ -36,6 +36,6 @@ public class Api_ContractController extends BaseController {
 
     @GetMapping("/look")
     public void look(HttpServletResponse response) throws IOException {
-        contractService.look(response);
+        contractService.look(response, getUser().getId());
     }
 }

+ 18 - 11
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/UserController.java

@@ -1,22 +1,21 @@
 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.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.web.work.domain.User;
+import com.ruoyi.web.work.service.IContractService;
 import com.ruoyi.web.work.service.IUserService;
-import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 用户管理
@@ -29,6 +28,9 @@ public class UserController extends BaseController {
     @Autowired
     private IUserService userService;
 
+    @Autowired
+    private IContractService contractService;
+
     @PreAuthorize("@ss.hasPermi('work:user:list')")
     @GetMapping("/list")
     public TableDataInfo list(User user){
@@ -63,4 +65,9 @@ public class UserController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids){
         return toAjax(userService.removeByIds(Arrays.asList(ids)));
     }
+
+    @GetMapping("/look")
+    public void look(HttpServletResponse response,Long userId) throws IOException {
+        contractService.look(response,userId);
+    }
 }

+ 0 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/CompanyMapper.java

@@ -16,7 +16,6 @@ import java.util.List;
 public interface CompanyMapper extends BaseMapper<Company> {
     List<Company> selectList(Company company);
 
-    @Select("SELECT * FROM tb_company WHERE state=0 AND company_name=#{companyName}")
     List<CompanyListVo> selectCompanyList(CompanyDto dto);
 
     @Select("SELECT * FROM tb_company WHERE company_name=#{companyName}")

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IContractService.java

@@ -21,5 +21,5 @@ public interface IContractService extends IService<Contract>{
 
     AjaxResult add(ContractDto dto) throws ServerException;
 
-    void look(HttpServletResponse response) throws IOException;
+    void look(HttpServletResponse response,Long userId) throws IOException;
 }

+ 8 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ContractServiceImpl.java

@@ -84,8 +84,12 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     }
 
     @Override
-    public void look(HttpServletResponse response) throws IOException {
-        ContractDetail detail = detailService.selectByUserId(AppUtil.getUser().getId());
+    public void look(HttpServletResponse response,Long userId) throws IOException {
+        User user=userService.getById(userId);
+        if(user==null){
+            throw new ServerException("用户信息不存在");
+        }
+        ContractDetail detail = detailService.selectByUserId(userId);
         if (detail == null) {
             throw new ServerException("你还未签约");
         }
@@ -102,7 +106,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         picture.setWidth(80); // 设置图片宽度
         picture.setHeight(30); // 设置图片高度
         // 查找并替换占位符
-        //doc.replace("${jiaSign}", "高韦神", true, true);
+        doc.replace("${sfz}", user.getIdCard(), true, true);
+        doc.replace("${phone}", user.getPhone(), true, true);
 
         // 查找并替换占位符
         TextSelection[] selections = doc.findAllString("${jiaSign}", true, true);

+ 4 - 0
ruoyi-admin/src/main/resources/mapper/work/CompanyMapper.xml

@@ -25,4 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+    <select id="selectCompanyList" resultType="com.ruoyi.web.work.domain.vo.CompanyListVo">
+        SELECT * FROM tb_company WHERE state=0 AND company_name like concat('%', #{companyName}, '%')
+    </select>
+
 </mapper>