lsw 1 年之前
父节点
当前提交
fcd4bde796
共有 24 个文件被更改,包括 869 次插入59 次删除
  1. 4 3
      admin-ui/src/views/work/company/edit.vue
  2. 23 5
      admin-ui/src/views/work/company/index.vue
  3. 10 9
      admin-ui/src/views/work/project/edit.vue
  4. 31 9
      admin-ui/src/views/work/project/index.vue
  5. 100 0
      admin-ui/src/views/work/project/packages/index.vue
  6. 142 8
      app/pages/packages/index.vue
  7. 1 1
      app/pages/user/index.vue
  8. 38 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_PackagesController.java
  9. 34 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ProjectController.java
  10. 62 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PackagesController.java
  11. 8 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Company.java
  12. 75 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Packages.java
  13. 17 7
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Project.java
  14. 55 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/PackagesListVo.java
  15. 57 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ProjectListVo.java
  16. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/PackagesMapper.java
  17. 6 2
      ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/ProjectMapper.java
  18. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IPackagesService.java
  19. 6 2
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IProjectService.java
  20. 56 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/PackagesServiceImpl.java
  21. 29 5
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ProjectServiceImpl.java
  22. 2 2
      ruoyi-admin/src/main/resources/mapper/work/CompanyMapper.xml
  23. 38 0
      ruoyi-admin/src/main/resources/mapper/work/PackagesMapper.xml
  24. 34 6
      ruoyi-admin/src/main/resources/mapper/work/ProjectMapper.xml

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

@@ -60,12 +60,12 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="登录账号" prop="userName">
-              <el-input v-model="form.userName" placeholder="请输入手机号" :disabled="form.id" clearable />
+              <el-input v-model="form.userName" placeholder="请输入手机号" auto-complete="user" clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="登录密码" prop="password">
-              <el-input type="password" v-model="form.password" placeholder="默认123456" :disabled="form.id" clearable />
+              <el-input type="password" v-model="form.password" placeholder="默认123456" auto-complete="password" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -91,7 +91,8 @@ export default {
         business: [{ required: true, message: '不能为空', trigger: 'blur' }],
         bankName: [{ required: true, message: '不能为空', trigger: 'blur' }],
         bankAccount: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        b1: [{ required: true, message: '不能为空', trigger: 'blur' }]
+        b1: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        userName: [{ required: true, message: '账号不能为空', trigger: 'blur' }]
       }
     };
   },

+ 23 - 5
admin-ui/src/views/work/company/index.vue

@@ -4,6 +4,18 @@
       <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="director">
+        <el-input v-model="queryParams.director" 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-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>
@@ -17,11 +29,11 @@
     </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="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="left" prop="companyName" />
+      <el-table-column label="企业方负责人" align="center" prop="director" width="120" />
+      <el-table-column label="手机号" align="center" prop="phone" width="150" />
+      <el-table-column label="账户余额(元)" align="center" prop="money" width="120" />
+      <el-table-column label="创建日期" align="center" prop="createTime" width="180" />
       <el-table-column label="账号状态" align="center" prop="state" width="100">
         <template slot-scope="scope">
           <div class="switch">
@@ -55,6 +67,7 @@ export default {
       ids: [],
       showSearch: true,
       response: {},
+      dateRange: [],
       queryParams: {
         pageNum: 1,
         pageSize: 10,
@@ -72,6 +85,10 @@ export default {
   },
   methods: {
     getList() {
+      if (this.dateRange) {
+        this.queryParams.dateBegin = this.dateRange[0];
+        this.queryParams.dateEnd = this.dateRange[1];
+      }
       this.ajax({ url: '/work/company/list', data: this.queryParams }).then((response) => {
         this.response = response;
       });
@@ -82,6 +99,7 @@ export default {
     },
     resetQuery() {
       this.resetForm('queryForm');
+      this.dateRange = [];
       this.handleQuery();
     },
     selects(rows) {

+ 10 - 9
admin-ui/src/views/work/project/edit.vue

@@ -14,7 +14,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="项目编号" prop="num">
-              <el-input v-model="form.num" placeholder="自动根据年月日生成" disabled :disabled="param.detail" />
+              <el-input v-model="form.num" placeholder="自动根据年月日生成" disabled/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -25,8 +25,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="结算日" prop="bData">
-              <el-date-picker clearable v-model="form.bData" type="date" value-format="yyyy-MM-dd" placeholder="请选择结算日" :disabled="param.detail"></el-date-picker>
+            <el-form-item label="结算日" prop="balanceDate">
+              <el-date-picker clearable v-model="form.balanceDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择结算日" :disabled="param.detail"></el-date-picker>
             </el-form-item>
           </el-col>
         </el-row>
@@ -50,8 +50,9 @@ export default {
       form: {},
       rules: {
         projectName: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        sData: [{ required: true, message: '不能为空', trigger: 'blur' }],
-        bData: [{ required: true, message: '不能为空', trigger: 'blur' }]
+        startDate: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        finishDate: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        balanceDate: [{ required: true, message: '不能为空', trigger: 'blur' }]
       }
     };
   },
@@ -70,16 +71,16 @@ export default {
     if (this.param.id) {
       this.ajax({ url: '/work/project/detail/' + this.param.id }).then((response) => {
         this.form = response.data;
-        this.dateRange.push(this.form.sData);
-        this.dateRange.push(this.form.eData);
+        this.dateRange.push(this.form.startDate);
+        this.dateRange.push(this.form.finishDate);
       });
     }
   },
   methods: {
     submitForm() {
       if (this.dateRange) {
-        this.form.sData = this.dateRange[0];
-        this.form.eData = this.dateRange[1];
+        this.form.startDate = this.dateRange[0];
+        this.form.finishDate = this.dateRange[1];
       }
       this.$refs['form'].validate((valid) => {
         if (valid) {

+ 31 - 9
admin-ui/src/views/work/project/index.vue

@@ -29,19 +29,19 @@
     </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="projectName" />
+      <el-table-column label="项目名称" align="center" prop="projectName" width="230" />
       <el-table-column label="项目编号" align="center" prop="num" />
-      <el-table-column label="项目周期" align="center">
+      <el-table-column label="项目周期" align="center" width="200">
         <template slot-scope="scope">
-          <span>{{ scope.row.sData }}至{{ scope.row.eData }}</span>
+          <span>{{ scope.row.startDate }} 至 {{ scope.row.finishDate }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="服务公司" align="center">
+      <el-table-column label="服务公司" align="center" width="150">
         <template slot-scope="scope">
           <div class="omit" :title="scope.row.serviceCompany">{{ scope.row.serviceCompany }}</div>
         </template>
       </el-table-column>
-      <el-table-column label="接包人数" align="center" prop="peoples" width="120">
+      <el-table-column label="接包人数" align="center" prop="peoples" width="110">
         <template slot-scope="scope">
           <div class="omit">{{ scope.row.peoples || 0 }}</div>
         </template>
@@ -51,14 +51,15 @@
         <template slot-scope="scope">
           <div class="switch">
             <el-switch v-model="scope.row.state" :active-value="0" :width="50" :inactive-value="1" @change="op('change', scope.row)"></el-switch>
-            <span class="zc" v-if="scope.row.state == 0">启用</span>
-            <span class="ty" v-else>用</span>
+            <span class="zc" v-if="scope.row.state == 0">发布</span>
+            <span class="ty" v-else>用</span>
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" align="center" width="250" fixed="right">
         <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:project:list']">查看</el-button>
+          <el-button size="mini" type="text" icon="el-icon-s-goods" @click="op('packages', scope.row)" v-hasPermi="['work:project:list']">接包明细</el-button>
+          <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:project:list']">详情</el-button>
           <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit', scope.row)" v-hasPermi="['work:project:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="del(scope.row)" v-hasPermi="['work:project:remove']">删除</el-button>
         </template>
@@ -73,6 +74,7 @@
 
 <script>
 import edit from './edit';
+import packages from './packages/index.vue';
 export default {
   name: 'Project',
   data() {
@@ -123,12 +125,32 @@ export default {
         return;
       }
       const id = row.id || this.ids[0];
+      if (tag == 'packages') {
+        this.iframe({ obj: packages, param: { projectId: row.id }, title: '接包明细', width: '65%', height: '75%' });
+      }
       if (tag == 'detail') {
         this.iframe({ obj: edit, param: { id: id, detail: true }, title: '项目详情', width: '55%', height: '55%' });
       }
       if (tag == 'edit') {
         this.iframe({ obj: edit, param: { id: id }, title: '编辑项目', width: '55%', height: '55%' });
       }
+      //账号状态
+      if (tag == 'change') {
+        let text = row.state === 0 ? '发布' : '停用';
+        this.$confirm('确认要' + text + '该项目吗?', '警告', { type: 'warning' })
+          .then(() => {
+            this.post({ url: '/work/project/edit', data: { id: row.id, state: row.state } })
+              .then((response) => {
+                this.$modal.msgSuccess(text + '成功');
+              })
+              .catch(() => {
+                row.state = row.state === 0 ? 1 : 0;
+              });
+          })
+          .catch(() => {
+            row.state = row.state === 0 ? 1 : 0;
+          });
+      }
     },
     del(row) {
       this.$confirm('是否确认删除选中数据?', '警告', { type: 'warning' }).then(() => {

+ 100 - 0
admin-ui/src/views/work/project/packages/index.vue

@@ -0,0 +1,100 @@
+<template>
+  <div class="cmain">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch">
+      <el-form-item label="关联项目" prop="projectId">
+        <el-input v-model="queryParams.projectId" placeholder="请输入关联项目" @keyup.enter.native="handleQuery" clearable class="inp" />
+      </el-form-item>
+      <el-form-item label="状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入状态" @keyup.enter.native="handleQuery" clearable class="inp" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="response.rows" border @selection-change="selects">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="name" />
+      <el-table-column label="身份证" align="center" prop="idCard" />
+      <el-table-column label="手机号" align="center" prop="phone" />
+      <el-table-column label="支付宝账号" align="center" prop="alipay" />
+      <el-table-column label="状态" align="center" prop="state" />
+      <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>
+export default {
+  name: 'Packages',
+  data() {
+    return {
+      ids: [],
+      showSearch: true,
+      response: {},
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        projectId: null,
+        state: null,
+        orderByColumn: 'id',
+        isAsc: 'desc'
+      }
+    };
+  },
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    layerid: {
+      type: String
+    }
+  },
+  mounted() {
+    this.queryParams.projectId = this.param.projectId;
+    this.getList();
+  },
+  methods: {
+    getList() {
+      this.ajax({ url: '/work/packages/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 == 'add') {
+        this.iframe({ obj: edit, param: {}, title: '新增', width: '45%', height: '55%' });
+      }
+      if (tag == 'edit') {
+        const id = row.id || this.ids[0];
+        this.iframe({ obj: edit, param: { id: id }, title: '编辑', width: '50%', height: '50%' });
+      }
+    },
+    del(row) {
+      this.$confirm('是否确认删除选中数据?', '警告', { type: 'warning' }).then(() => {
+        this.get({ url: '/work/packages/remove/' + (row.id || this.ids) }).then((response) => {
+          this.$modal.msgSuccess('删除成功');
+          this.getList();
+        });
+      });
+    }
+  }
+};
+</script>

+ 142 - 8
app/pages/packages/index.vue

@@ -1,19 +1,153 @@
 <template>
-	<view>
-		
+	<view class="main">
+		<view class="tab">
+			<u-tabs :list="tab" :current="current" @click="click"></u-tabs>
+		</view>
+		<view class="list">
+			<view class="item" v-for="(item, index) in list" :key="index">
+				<view class="it">
+					<view class="lable">项目名称</view>
+					<view class="desc">{{ item.projectName }}</view>
+				</view>
+				<view class="it">
+					<view class="lable">发包公司</view>
+					<view class="desc">{{ item.companyName }}</view>
+				</view>
+				<view class="it">
+					<view class="lable">项目周期</view>
+					<view class="desc">{{ item.startDate }} 至 {{ item.finishDate }}</view>
+				</view>
+				<view class="it">
+					<view class="lable">结算日期</view>
+					<view class="desc">{{ item.balanceDate }}</view>
+				</view>
+				<view class="op">
+					<text>{{ item.createTime }}</text>
+					<text class="del" @click="add(item)">接包</text>
+				</view>
+			</view>
+			<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
+			<u-empty v-if="!loadMore && list.length == 0"></u-empty>
+		</view>
 	</view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				
-			};
+export default {
+	data() {
+		return {
+			current: 0,
+			tab: [{ name: '待接包' }, { name: '已接包' }, { name: '已完成' }],
+			list: [],
+			param: { pageNum: 1, pageSize: 10 },
+			loadMore: true
+		};
+	},
+	onLoad(e) {
+		this.getData();
+	},
+	methods: {
+		getData() {
+			this.http.request({
+				url: this.current === 0 ? '/app/project/list' : '/app/packages/list',
+				data: this.param,
+				loading: 'false',
+				success: (res) => {
+					this.loadMore = res.data.pages > this.param.pageNum ? true : false;
+					res.data.rows.forEach((item) => {
+						item.createTime = uni.$u.timeFrom(Date.parse(item.createTime));
+						this.list.push(item);
+					});
+				}
+			});
+		},
+		click(e) {
+			this.current = e.index;
+			this.param.state = e.index === 1 ? 0 : 1;
+			this.refresh();
+		},
+		add(item) {
+			this.http.request({
+				url: '/app/packages/add',
+				data: { projectId: item.id },
+				method: 'POST',
+				success: (res) => {
+					uni.showModal({
+						title: '提示',
+						content: '接包成功',
+						showCancel: false,
+						success: (res) => {
+							this.refresh();
+						}
+					});
+				}
+			});
+		},
+		//刷新数据
+		refresh() {
+			this.loadMore = true;
+			this.param.pageNum = 1;
+			this.list = [];
+			this.getData();
+		}
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		setTimeout(() => {
+			this.refresh();
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	//上拉加载
+	onReachBottom() {
+		if (this.loadMore) {
+			this.param.pageNum++;
+			this.getData();
 		}
 	}
+};
 </script>
 
 <style lang="scss">
-
+.main {
+	padding: 0px 15px 10px 15px;
+}
+.tab {
+	background-color: white;
+	border-radius: 5px;
+}
+.list {
+	padding-top: 13px;
+	.item {
+		background-color: white;
+		padding: 15px;
+		border-radius: 5px;
+		margin-bottom: 10px;
+		.it {
+			overflow: hidden;
+			padding: 7px 0px 7px 0px;
+			.lable {
+				float: left;
+				font-size: 14px;
+				color: #787878;
+			}
+			.desc {
+				float: right;
+				font-size: 14px;
+				width: 60%;
+				text-align: right;
+			}
+		}
+		.op {
+			border-top: 1px solid $line;
+			padding-top: 10px;
+			color: #676767;
+			font-size: 14px;
+			.del {
+				float: right;
+				color: #f44336;
+			}
+		}
+	}
+}
 </style>

+ 1 - 1
app/pages/user/index.vue

@@ -44,7 +44,7 @@ export default {
 		};
 	},
 	onShow() {
- 		/*  this.user = {
+/* 		  this.user = {
 			token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjI2NTFjMmU4LTAxNzEtNDQwYS04YjA2LTcwOWI3N2ZhNGZiZCJ9.zb2gQaeHZApJkbo4LoSeZfnVVsJJ-QabY7FnsVn13Kf1KUgKeBQ82bwhzD-CqchI1dhUOQFoVh__zeJaJHFWGg'
 		};
 		uni.setStorageSync('user', this.user); */

+ 38 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_PackagesController.java

@@ -0,0 +1,38 @@
+package com.ruoyi.web.work.api;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.web.work.domain.Packages;
+import com.ruoyi.web.work.domain.vo.PackagesListVo;
+import com.ruoyi.web.work.service.IPackagesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 接包管理
+ *
+ * @author lsw
+ * @date 2024-04-19
+ */
+@RestController
+@RequestMapping("/app/packages")
+public class Api_PackagesController extends BaseController {
+    @Autowired
+    private IPackagesService packagesService;
+
+    @GetMapping("/list")
+    public TableDataInfo list(Packages packages) {
+        startPage();
+        List<PackagesListVo> list = packagesService.selectPackagesList(packages);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/add")
+    public AjaxResult add(@Validated @RequestBody Packages packages) {
+        return packagesService.add(packages);
+    }
+}

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_ProjectController.java

@@ -0,0 +1,34 @@
+package com.ruoyi.web.work.api;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.web.work.domain.Project;
+import com.ruoyi.web.work.domain.vo.ProjectListVo;
+import com.ruoyi.web.work.service.IProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 项目管理
+ *
+ * @author lsw
+ * @date 2024-04-15
+ */
+@RestController
+@RequestMapping("/app/project")
+public class Api_ProjectController extends BaseController {
+    @Autowired
+    private IProjectService projectService;
+
+    @GetMapping("/list")
+    public TableDataInfo list(Project project) {
+        startPage();
+        List<ProjectListVo> list = projectService.selectProjectList(project);
+        return getDataTable(list);
+    }
+
+}

+ 62 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PackagesController.java

@@ -0,0 +1,62 @@
+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.Packages;
+import com.ruoyi.web.work.service.IPackagesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 接包管理
+ * @author lsw
+ * @date 2024-04-19
+ */
+@RestController
+@RequestMapping("/work/packages")
+public class PackagesController extends BaseController {
+    @Autowired
+    private IPackagesService packagesService;
+
+    @PreAuthorize("@ss.hasPermi('work:packages:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(Packages packages){
+        startPage();
+        List<Packages> list = packagesService.selectList(packages);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:packages:query')")
+    @GetMapping(value = "/detail/{id}")
+    public AjaxResult detail(@PathVariable("id") Long id){
+        return AjaxResult.success(packagesService.getById(id));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:packages:add')")
+    @Log(title = "接包管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody Packages packages){
+        return toAjax(packagesService.save(packages));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:packages:edit')")
+    @Log(title = "接包管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody Packages packages){
+        return toAjax(packagesService.updateById(packages));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:packages:remove')")
+    @Log(title = "接包管理", businessType = BusinessType.DELETE)
+    @GetMapping("/remove/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids){
+        return toAjax(packagesService.removeByIds(Arrays.asList(ids)));
+    }
+}

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

@@ -75,4 +75,12 @@ public class Company{
     @TableField(exist = false)
     private String password;
 
+    //开始日期
+    @TableField(exist = false)
+    private String dateBegin;
+
+    //结束日期
+    @TableField(exist = false)
+    private String dateEnd;
+
 }

+ 75 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Packages.java

@@ -0,0 +1,75 @@
+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.NotNull;
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-04-19
+ */
+@Data
+@TableName(value = "tb_packages")
+@Accessors(chain = true)
+public class Packages {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "关联用户")
+    private Long userId;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "关联项目")
+    private Long projectId;
+
+    @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;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "手机号")
+    private Long phone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "身份证")
+    private String idCard;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "开户行")
+    private String bankName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "银行卡账号")
+    private String bankAccount;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "支付宝")
+    private String alipay;
+
+
+}

+ 17 - 7
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Project.java

@@ -4,11 +4,14 @@ 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 com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
 import java.util.Date;
+import java.util.List;
+
 /**
  * @author lsw
  * @date 2024-04-15
@@ -16,7 +19,7 @@ import java.util.Date;
 @Data
 @TableName(value = "tb_project")
 @Accessors(chain = true)
-public class Project{
+public class Project {
     private static final long serialVersionUID = 1L;
 
     private Long id;
@@ -41,22 +44,19 @@ public class Project{
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "开始时间")
-    private Date sData;
+    private Date startDate;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "结束时间")
-    private Date eData;
+    private Date finishDate;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "结算日")
-    private Date bData;
+    private Date balanceDate;
 
     @ApiModelProperty(value = "接包人数")
     private Long peoples;
 
-    @ApiModelProperty(value = "是否置顶")
-    private Integer top;
-
     @ApiModelProperty(value = "状态:0=正常,1=停用")
     private Integer state;
 
@@ -76,10 +76,20 @@ public class Project{
 
     //开始日期
     @TableField(exist = false)
+    @JsonIgnore
     private String dateBegin;
 
     //结束日期
     @TableField(exist = false)
+    @JsonIgnore
     private String dateEnd;
 
+    @TableField(exist = false)
+    @JsonIgnore
+    private List<Long> companyIds;
+
+    @TableField(exist = false)
+    @JsonIgnore
+    private List<Long> projectIds;
+
 }

+ 55 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/PackagesListVo.java

@@ -0,0 +1,55 @@
+package com.ruoyi.web.work.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-04-16
+ */
+@Data
+@Accessors(chain = true)
+public class PackagesListVo {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "企业名称")
+    private String companyName;
+
+    @ApiModelProperty(value = "项目编号")
+    private String num;
+
+    @ApiModelProperty(value = "项目内容")
+    private String contents;
+
+    @ApiModelProperty(value = "服务公司")
+    private String serviceCompany;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "开始时间")
+    private Date startDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "结束时间")
+    private Date finishDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "结算日")
+    private Date balanceDate;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 57 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/vo/ProjectListVo.java

@@ -0,0 +1,57 @@
+package com.ruoyi.web.work.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author lsw
+ * @date 2024-04-16
+ */
+@Data
+@Accessors(chain = true)
+public class ProjectListVo {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "关联企业")
+    private Long companyId;
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "企业名称")
+    private String companyName;
+
+    @ApiModelProperty(value = "项目编号")
+    private String num;
+
+    @ApiModelProperty(value = "项目内容")
+    private String contents;
+
+    @ApiModelProperty(value = "服务公司")
+    private String serviceCompany;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "开始时间")
+    private Date startDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "结束时间")
+    private Date finishDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "结算日")
+    private Date balanceDate;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/PackagesMapper.java

@@ -0,0 +1,21 @@
+package com.ruoyi.web.work.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.work.domain.Packages;
+import com.ruoyi.web.work.domain.vo.PackagesListVo;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-19
+ */
+public interface PackagesMapper extends BaseMapper<Packages> {
+    List<Packages> selectList(Packages packages);
+
+    List<PackagesListVo> selectPackagesList(Packages packages);
+
+    @Select("SELECT * FROM tb_packages WHERE user_id=#{userId} AND project_id= #{projectId}")
+    Packages check(Packages packages);
+}

+ 6 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/ProjectMapper.java

@@ -1,8 +1,10 @@
 package com.ruoyi.web.work.mapper;
 
-import java.util.List;
-import com.ruoyi.web.work.domain.Project;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.work.domain.Project;
+import com.ruoyi.web.work.domain.vo.ProjectListVo;
+
+import java.util.List;
 
 /**
  * @author lsw
@@ -10,4 +12,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ProjectMapper extends BaseMapper<Project> {
     List<Project> selectList(Project project);
+
+    List<ProjectListVo> selectProjectList(Project project);
 }

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IPackagesService.java

@@ -0,0 +1,20 @@
+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.Packages;
+import com.ruoyi.web.work.domain.vo.PackagesListVo;
+
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-19
+ */
+public interface IPackagesService extends IService<Packages>{
+    List<Packages> selectList(Packages packages);
+
+    List<PackagesListVo> selectPackagesList(Packages packages);
+
+    AjaxResult add(Packages packages);
+}

+ 6 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IProjectService.java

@@ -1,8 +1,10 @@
 package com.ruoyi.web.work.service;
 
-import java.util.List;
-import com.ruoyi.web.work.domain.Project;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.work.domain.Project;
+import com.ruoyi.web.work.domain.vo.ProjectListVo;
+
+import java.util.List;
 
 /**
  * @author lsw
@@ -10,4 +12,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IProjectService extends IService<Project>{
     List<Project> selectList(Project project);
+
+    List<ProjectListVo> selectProjectList(Project project);
 }

+ 56 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/PackagesServiceImpl.java

@@ -0,0 +1,56 @@
+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.web.work.api.util.AppUtil;
+import com.ruoyi.web.work.domain.Packages;
+import com.ruoyi.web.work.domain.Project;
+import com.ruoyi.web.work.domain.vo.PackagesListVo;
+import com.ruoyi.web.work.mapper.PackagesMapper;
+import com.ruoyi.web.work.service.IPackagesService;
+import com.ruoyi.web.work.service.IProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author lsw
+ * @date 2024-04-19
+ */
+@Service
+public class PackagesServiceImpl extends ServiceImpl<PackagesMapper, Packages> implements IPackagesService {
+    @Autowired
+    private PackagesMapper packagesMapper;
+
+    @Autowired
+    private IProjectService projectService;
+
+    @Override
+    public List<Packages> selectList(Packages packages) {
+        return packagesMapper.selectList(packages);
+    }
+
+    @Override
+    public List<PackagesListVo> selectPackagesList(Packages packages) {
+        packages.setUserId(AppUtil.getUser().getId());
+        return packagesMapper.selectPackagesList(packages);
+    }
+
+    @Transactional
+    @Override
+    public AjaxResult add(Packages packages) {
+        Project project = projectService.getById(packages.getProjectId());
+        if (project == null || project.getState() == 1) {
+            return AjaxResult.error("项目不存在或被停用");
+        }
+        packages.setUserId(AppUtil.getUser().getId());
+        Packages check = packagesMapper.check(packages);
+        if (check != null) {
+            return AjaxResult.error("请勿重复接包");
+        }
+        save(packages);
+        return AjaxResult.success();
+    }
+}

+ 29 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/ProjectServiceImpl.java

@@ -1,12 +1,21 @@
 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.ProjectMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.work.api.util.AppUtil;
+import com.ruoyi.web.work.domain.Packages;
 import com.ruoyi.web.work.domain.Project;
+import com.ruoyi.web.work.domain.Relate;
+import com.ruoyi.web.work.domain.vo.ProjectListVo;
+import com.ruoyi.web.work.domain.vo.RelateCompanyListVo;
+import com.ruoyi.web.work.mapper.ProjectMapper;
+import com.ruoyi.web.work.service.IPackagesService;
 import com.ruoyi.web.work.service.IProjectService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.work.service.IRelateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author lsw
@@ -17,8 +26,23 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Autowired
     private ProjectMapper projectMapper;
 
+    @Autowired
+    private IRelateService relateService;
+
+    @Autowired
+    private IPackagesService packagesService;
+
     @Override
     public List<Project> selectList(Project project) {
         return projectMapper.selectList(project);
     }
+
+    @Override
+    public List<ProjectListVo> selectProjectList(Project project) {
+        List<RelateCompanyListVo> list = relateService.selectRelateCompanyList(new Relate().setUserId(AppUtil.getUser().getId()));
+        List<Packages> packagesList = packagesService.selectList(new Packages().setUserId(AppUtil.getUser().getId()));
+        project.setCompanyIds(list.stream().map(RelateCompanyListVo::getCompanyId).collect(Collectors.toList()));
+        project.setProjectIds(packagesList.stream().map(Packages::getProjectId).collect(Collectors.toList()));
+        return projectMapper.selectProjectList(project);
+    }
 }

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

@@ -8,10 +8,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select * from tb_company
         <where>  
             <if test="companyName != null  and companyName != ''"> and company_name like concat('%', #{companyName}, '%')</if>
-            <if test="director != null  and director != ''"> and director = #{director}</if>
+            <if test="director != null  and director != ''"> and director like concat('%', #{director}, '%')</if>
             <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
-            <if test="address != null  and address != ''"> and address = #{address}</if>
             <if test="state != null "> and state = #{state}</if>
+            <if test="dateBegin != null  and dateBegin != ''"> AND create_time BETWEEN #{dateBegin} AND #{dateEnd} + INTERVAL 1 DAY</if>
         </where>
     </select>
 

+ 38 - 0
ruoyi-admin/src/main/resources/mapper/work/PackagesMapper.xml

@@ -0,0 +1,38 @@
+<?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.PackagesMapper">
+    
+    <select id="selectList" resultType="com.ruoyi.web.work.domain.Packages">
+        SELECT
+        p.id,
+        p.create_time,
+        u.NAME,
+        u.id_card,
+        u.alipay,
+        u.phone,
+        u.bank_account,
+        u.bank_name
+        FROM
+        tb_packages p
+        LEFT JOIN tb_user u ON u.id = p.user_id
+        <where>  
+            <if test="userId != null "> and p.user_id = #{userId}</if>
+            <if test="projectId != null "> and p.project_id = #{projectId}</if>
+            <if test="state != null "> and p.state = #{state}</if>
+        </where>
+    </select>
+
+    <select id="selectPackagesList" resultType="com.ruoyi.web.work.domain.vo.PackagesListVo">
+        SELECT
+        p.*,
+        c.company_name
+        FROM
+        tb_packages a
+        LEFT JOIN tb_project p ON p.id = a.project_id
+        LEFT JOIN tb_company c ON c.id=p.company_id
+        WHERE a.user_id =#{userId} AND a.state = #{state}
+    </select>
+
+</mapper>

+ 34 - 6
ruoyi-admin/src/main/resources/mapper/work/ProjectMapper.xml

@@ -5,14 +5,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="com.ruoyi.web.work.mapper.ProjectMapper">
     
     <select id="selectList" resultType="com.ruoyi.web.work.domain.Project">
-        select * from tb_project
+        SELECT
+        p.id,
+        p.project_name,
+        p.num,
+        p.create_by,
+        p.create_time,
+        p.start_date,
+        p.finish_date,
+        p.balance_date,
+        p.state,
+        p.service_company,
+        ( SELECT COUNT( a.id ) FROM tb_packages a WHERE a.project_id = p.id ) AS peoples
+        FROM
+        tb_project p
         <where>  
-            <if test="companyId != null "> and company_id = #{companyId}</if>
-            <if test="projectName != null  and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
-            <if test="num != null  and num != ''"> and num like concat('%', #{num}, '%') </if>
-            <if test="state != null "> and state = #{state}</if>
-            <if test="dateBegin != null  and dateBegin != ''"> AND create_time BETWEEN #{dateBegin} AND #{dateEnd} + INTERVAL 1 DAY</if>
+            <if test="companyId != null "> and p.company_id = #{companyId}</if>
+            <if test="projectName != null  and projectName != ''"> and p.project_name like concat('%', #{projectName}, '%')</if>
+            <if test="num != null  and num != ''"> and p.num like concat('%', #{num}, '%') </if>
+            <if test="state != null "> and p.state = #{state}</if>
+            <if test="dateBegin != null  and dateBegin != ''"> AND p.create_time BETWEEN #{dateBegin} AND #{dateEnd} + INTERVAL 1 DAY</if>
         </where>
     </select>
+    <!--小程序待接包-->
+    <select id="selectProjectList" resultType="com.ruoyi.web.work.domain.vo.ProjectListVo">
+        SELECT
+        p.*,
+        c.company_name
+        FROM
+        tb_project p
+        LEFT JOIN tb_company c ON c.id = p.company_id
+        WHERE
+        p.state = 0
+        AND c.state =0
+        AND p.company_id IN (<foreach collection="companyIds" item="name" separator=",">#{name}</foreach>)
+        AND p.id NOT IN (<foreach collection="projectIds" item="name" separator=",">#{name}</foreach>)
+        ORDER BY p.id DESC
+    </select>
 
 </mapper>