提交 65bd1fc7 authored 作者: 任建彩's avatar 任建彩

钉钉考勤和项目节点

上级 f55ccc66
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.Customer;
import com.zrqx.olive.project.request.QueryCustomerRequest;
@Mapper
public interface CustomerDao extends BaseMapper<Customer> {
@Select("<script>"
+ "SELECT id,customer,develop_num,px,status,DATE_FORMAT(upload_time,'%Y-%m-%d %H:%i:%s') upload_time FROM t_customer where 1=1 "
// 客户名称
+ "<if test = 'form.customer!=\"\" and form.customer!=null '> "
+ "AND customer like concat('%',#{form.customer},'%') "
+ "</if>"
// 状态
+ "<if test = 'form.status!=\"\" and form.status!=null'> "
+ "AND status = #{form.status} "
+ "</if>"
+ "</script>")
List<Customer> query(@Param("form")QueryCustomerRequest form);
@Select("<script>"
+ "SELECT max(px) FROM t_customer "
+ "</script>")
Integer selectByMaxSort();
}
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.DiyType;
/**
* 自定义分类
*/
@Mapper
public interface DiyTypeDao extends BaseMapper<DiyType> {
/**
* 查询排序号最大值
* @return
*/
@Select("select sort from t_diyType where parent_id = #{id} order by sort desc limit 1")
Integer getMaxOrderNum(String id);
/**
* 修改排序号
* @return
*/
@Update("update t_diyType set sort = #{sort} where parent_id = #{id}")
Integer updateSortByPrimaryKey(@Param("sort")Integer sort,@Param("id")String id);
@Select("<script>"
+ "select * from t_diyType where"
+ " parent_id = '0' ORDER BY create_time ASC "
+ "</script>")
List<DiyType> queryByDiyType();
/**
* 通过id集合查询分类
* @param ids
* @return
* @author rjc
* @date: 2019年3月22日 上午11:40:20
*/
@Select("<script>"
+ "select * from t_diyType a "
+ "where 1=1 "
+ "and id in "
+ " <foreach collection=\"ids\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">"
+ "#{id}"
+ "</foreach>"
+ "</script>")
List<DiyType> queryByDiytypelId(@Param("ids") List<String> ids);
}
package ProjectNode.java;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.ProjectFile;
@Mapper
public interface ProjectFileDao extends BaseMapper<ProjectFile> {
@Delete("<script>"
+ "delete FROM t_project_file where project_id = #{id} "
+ "</script>")
int deleteByEntity(String id);
@Delete("<script>"
+ "delete FROM t_project_file where task_id = #{id} "
+ "</script>")
int deleteByIdEntity(Integer id);
}
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.ProjectRecord;
import com.zrqx.olive.project.vo.ProjectRecordListVo;
@Mapper
public interface ProjectRecordDao extends BaseMapper<ProjectRecord> {
@Select("<script>"
+ "select id,DATE_FORMAT(upload_time,'%Y-%m-%d %H:%i:%s') upload_time,describes FROM t_project_record where 1=1"
+ "<if test = 'oid!=\"\" and oid!=null'> "
+ " AND project_id =#{oid} "
+ "</if>"
+ " order by upload_time DESC "
+ "</script>")
List<ProjectRecordListVo> list(String oid);
}
package ProjectNode.java;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.ProjectType;
@Mapper
public interface ProjectTypeDao extends BaseMapper<ProjectType> {
}
package ProjectNode.java;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.ProjectUser;
@Mapper
public interface ProjectUserDao extends BaseMapper<ProjectUser> {
@Delete("<script>"
+ "delete FROM t_project_user where project_id = #{id} "
+ "</script>")
int deleteByEntity(String id);
@Select("<script>"
+ "select user_id FROM t_project_user where project_id = #{oid} "
+ "</script>")
Integer[] userList(String oid);
}
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.personnel.vo.EchartsDataDaysVo;
import com.zrqx.olive.personnel.vo.EchartsDataMonthsVo;
import com.zrqx.olive.personnel.vo.EchartsDataweeksVo;
import com.zrqx.olive.personnel.vo.PreSaleEchartsDataMonthsVo;
import com.zrqx.olive.personnel.vo.PreSaleEchartsDataQuartersVo;
import com.zrqx.olive.personnel.vo.PreSaleEchartsDataYearsVo;
import com.zrqx.olive.project.model.StatisticsProject;
import com.zrqx.olive.project.request.QueryProjectRequest;
import com.zrqx.olive.project.vo.ProjectListVo;
import com.zrqx.olive.project.vo.ProjectListVo1;
public interface StatisticsProjectDao extends BaseMapper<StatisticsProject> {
@Select("<script>"
+ "select a.id,project,customer,customer_id,name,status,DATE_FORMAT(start_time,'%Y-%m-%d') start_time,"
+ "DATE_FORMAT(end_time,'%Y-%m-%d') end_time,px,presale,to_be_allocated FROM t_statistics_project a "
+ "<if test = 'roles ==11 or roles ==12 or roles ==13'> "
+ "INNER JOIN t_team_member_relation b on a.id=b.project_id where 1=1 and b.account_id =#{user_Id} "
+ "</if>"
+ "<if test = 'roles !=11 and roles !=12 and roles !=13'> "
+ " where 1=1 "
+ "</if>"
// 项目负责人
+ "<if test = 'form.name !=null'> "
+ "AND name like concat('%', #{form.name},'%') "
+ "</if>"
+ "<if test = 'form.project !=null'> "
+ "AND project like concat('%',#{form.project},'%') "
+ "</if>"
+ "<if test = 'form.customer !=null'> "
+ "AND customer like concat('%',#{form.customer},'%') "
+ "</if>"
// 项目状态
+ "<if test = 'form.status!=\"\" and form.status!=null'> "
+ " AND status = #{form.status} "
+ "</if>"
+ "<if test = 'form.presale!=null'> "
+ " AND presale = #{form.presale} "
+ "</if>"
+ "</script>")
List<ProjectListVo> queryProjectPage(@Param("form") QueryProjectRequest form,@Param("roles") Integer roles,@Param("user_Id") Integer user_Id);
@Select("<script>"
+ "SELECT max(px) FROM t_statistics_project "
+ "</script>")
Integer selectByMaxSort();
@Select("<script>"
+ "select a.id,project,px,status FROM t_statistics_project a "
+ "<if test = 'roles ==11 or roles ==12 or roles ==13'> "
+ "INNER JOIN t_team_member_relation b on a.id=b.project_id where 1=1 and b.account_id =#{user_Id} "
+ "</if>"
+ "<if test = 'roles !=11 and roles !=12 and roles !=13'> "
+ " where 1=1 "
+ "</if>"
+ "<if test = 'form.project !=\"\" and form.project !=null'> "
+ "AND project like concat('%',#{form.project},'%')"
+ "</if>"
+ "<if test = 'form.presale!=null'> "
+ " AND presale = #{form.presale} "
+ "</if>"
+ " order by start_time desc,px desc"
+ "</script>")
List<ProjectListVo1> list(@Param("form") QueryProjectRequest form, @Param("roles") Integer roles,@Param("user_Id") Integer user_Id);
@Select("<script>"
+ "select COUNT(*) FROM t_statistics_project p WHERE 1=1 "
+ "<if test = 'status!=null'> "
+ " and p.status = #{status} "
+ "</if>"
+ "<if test = 'years!=null'> "
+ " and YEAR(p.start_time) = #{years} "
+ "</if>"
+ "</script>")
Integer projetCount(@Param("years") String years,@Param("status") String status);
@Select("<script>"
+"SELECT days.days,IFNULL(SUM(working_hours),'0')sumTime,IFNULL(c.department_name,#{department_name}) deptName FROM "
+"(SELECT @date := DATE_ADD(@date, INTERVAL + 1 DAY) days FROM( "
+" SELECT @date := DATE_ADD(#{year1}, INTERVAL - 7 DAY) FROM t_task LIMIT 7 ) time) AS days "
+" LEFT JOIN t_task a ON TO_DAYS(a.complete_Time) = TO_DAYS(days.days) "
+"LEFT JOIN sys_department c on a.department_id=c.id where 1=1 "
+ "<if test = 'projectId!=null'> "
+ " and a.project_id =#{projectId}"
+ "</if>"
+ "<if test = 'department_name!=null'> "
+ " and (department_name =#{department_name} or department_name is null) "
+ "</if>"
+" GROUP BY days.days"
+ "</script>")
List<EchartsDataDaysVo> selectEChartsDataDs(@Param("department_name") String department_name,@Param("projectId") String projectId, @Param("year1") String year1);
@Select("<script>"
+ " SELECT IFNULL(SUM(a.working_hours),'0') sumTime,IFNULL(c.department_name,#{department_name}) deptName,DATE_FORMAT(complete_Time,'%Y年第%u周') weeks FROM t_task a, sys_department c"
+ " WHERE a.department_id=c.id and (department_name =#{department_name} or department_name is null) "
+ "<if test = 'projectId!=null'> "
+ " and a.project_id =#{projectId}"
+ "</if>"
+ " and DATE_FORMAT(a.complete_Time,'%Y-%m-%d') &gt;= DATE_FORMAT(DATE_SUB(#{year1}, INTERVAL 26 DAY),'%Y-%m-%d') "
+ " AND DATE_FORMAT(a.complete_Time,'%Y-%m-%d') &lt;= DATE_FORMAT(#{year1},'%Y-%m-%d') "
+ " GROUP BY weeks ORDER BY weeks "
+ "</script>")
List<EchartsDataweeksVo> selectEChartsWeeks(@Param("department_name") String department_name,@Param("projectId") String projectId, @Param("year1") String year1);
@Select("<script>"
+ " SELECT IFNULL(SUM(a.working_hours),'0') sumTime,IFNULL(c.department_name,#{department_name}) deptName,DATE_FORMAT(a.complete_Time,'%Y-%m') months FROM t_task a, sys_department c "
+ " WHERE a.department_id=c.id and (department_name =#{department_name} or department_name is null) "
+ "<if test = 'projectId!=null'> "
+ " and a.project_id =#{projectId}"
+ "</if>"
+ " AND a.complete_Time BETWEEN DATE_SUB(DATE_FORMAT(#{year1},'%Y-%m-%d'),INTERVAL 12 MONTH) AND DATE_FORMAT(#{year1},'%Y-%m-%d') "
+ " AND YEAR(a.complete_Time) = YEAR(#{year1}) "
+ " GROUP BY months ORDER BY months "
+ "</script>")
List<EchartsDataMonthsVo> selectEChartsDatams(@Param("department_name") String department_name,@Param("projectId") String projectId, @Param("year1") String year1);
@Select("<script>"
+ " SELECT IFNULL(SUM(a.working_hours),'0') sumTime,IFNULL(c.department_name,#{department_name}) deptName,DATE_FORMAT(a.complete_Time,'%Y-%m') months FROM t_task a, sys_department c "
+ " WHERE a.department_id=c.id and a.status=2 and (department_name =#{department_name} or department_name is null) "
+ "<if test = 'userId!=null'> "
+ " and a.user_id= #{userId}"
+ "</if>"
+ " AND a.complete_Time BETWEEN DATE_SUB(DATE_FORMAT(#{year1},'%Y-%m-%d'),INTERVAL 12 MONTH) AND DATE_FORMAT(#{year1},'%Y-%m-%d') "
+ " AND YEAR(a.complete_Time) = YEAR(#{year1}) "
+ " GROUP BY months ORDER BY months "
+ "</script>")
List<PreSaleEchartsDataMonthsVo> selectPreSaleEchartsMonthsData(@Param("department_name")String department_name,@Param("userId")Integer userId,@Param("year1")String year1);
@Select("<script>"
+"SELECT IFNULL(SUM(a.working_hours),'0') sumTime,IFNULL(c.department_name,#{department_name}) deptName,QUARTER(a.complete_Time) quarters "
+"from t_task a LEFT JOIN sys_department c ON a.department_id=c.id "
+" WHERE a.status=2 AND (department_name =#{department_name} or department_name is null)"
+ "<if test = 'userId!=null'> "
+ " and a.user_id= #{userId}"
+ "</if>"
+"AND QUARTER(a.complete_Time) IN(1,2,3,4) AND YEAR(complete_Time)=YEAR(#{year1}) "
+"GROUP BY quarters ORDER BY quarters "
+"</script>")
List<PreSaleEchartsDataQuartersVo> selectPreSaleEchartsQuartersData(@Param("department_name")String department_name,@Param("userId")Integer userId,@Param("year1")String year1);
@Select("<script>"
+"SELECT IFNULL(SUM(a.working_hours),'0') sumTime,IFNULL(c.department_name,#{department_name}) deptName,YEAR(a.complete_Time) years "
+"from t_task a LEFT JOIN sys_department c ON a.department_id=c.id "
+" WHERE a.status=2 AND (department_name =#{department_name} or department_name is null)"
+ "<if test = 'userId!=null'> "
+ " and a.user_id= #{userId}"
+ "</if>"
+"AND YEAR(a.complete_Time) &lt;= YEAR(#{year1}) "
+" GROUP BY years ORDER BY years "
+"</script>")
List<PreSaleEchartsDataYearsVo> selectPreSaleEchartsYearsData(@Param("department_name")String department_name,@Param("userId") Integer userId,@Param("year1")String year1);
}
package ProjectNode.java;
import java.math.BigDecimal;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.Team;
import com.zrqx.olive.project.request.QueryTeamRequest;
import com.zrqx.olive.project.vo.TeamListVo;
import com.zrqx.olive.project.vo.TeamVo;
@Mapper
public interface TeamDao extends BaseMapper<Team> {
@Select("<script>"
+ "SELECT id,department_id,department_name,project_id,total,"
+ "DATE_FORMAT(upload_time,'%Y-%m-%d %H:%i:%s') upload_time FROM t_team where 1=1 "
// 项目ID
+ "<if test = 'form.projectId!=\"\" and form.projectId!=null '> "
+ " AND project_id = #{form.projectId} "
+ "</if>"
+ "</script>")
List<TeamListVo> query(@Param("form")QueryTeamRequest form);
@Select("<script>"
+ "SELECT id,department_id,department_name FROM t_team where 1=1 "
// 项目ID
+ "<if test = 'projectId!=\"\" and projectId!=null '> "
+ " AND project_id = #{projectId} "
+ "</if>"
+ "</script>")
List<TeamVo> getProjectId(String projectId);
@Select("<script>"
+ "SELECT sum(allocate_surplus) FROM t_team where 1=1 "
// 项目ID
+ "<if test = 'projectId!=\"\" and projectId!=null '> "
+ " AND project_id = #{projectId} "
+ "</if>"
+ "</script>")
BigDecimal queryAllocateSurplus(String projectId);
}
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.TeamMemberRelation;
import com.zrqx.olive.project.request.QueryTeamMemberRequest;
import com.zrqx.olive.project.vo.TeamMemberListVo;
import com.zrqx.olive.project.vo.TeamMemberVo;
@Mapper
public interface TeamMemberRelationDao extends BaseMapper<TeamMemberRelation> {
@Select("<script>"
+ "SELECT t1.id mid,t2.id,t2.real_name,t4.department_name,t1.project_id,t1.role_name,DATE_FORMAT(t1.upload_time,'%Y-%m-%d') upload_time,t1.team_id "
+ "from t_team_member_relation t1 "
+ "INNER JOIN eb_system_admin t2 on t1.account_id=t2.id "
+ "INNER JOIN sys_department t4 on t2.department_id=t4.id where 1=1"
// 项目团队
+ "<if test = 'form.projectId !=\"\" and form.projectId !=null'> "
+ "AND t1.project_id =#{form.projectId} "
+ "</if>"
// 项目id
+ "<if test = 'form.teamId!=\"\" and form.teamId !=null'> "
+ "AND t1.team_id = #{form.teamId} "
+ "</if>"
+ "<if test = 'form.account!=\"\" and form.account !=null'> "
+ "AND t2.real_name like concat('%',#{form.account},'%')"
+ "</if>"
+ "<if test = 'form.departmentId!=\"\" and form.departmentId !=null'> "
+ "AND t4.id = #{form.departmentId} "
+ "</if>"
+ " order by upload_time desc"
+ "</script>")
List<TeamMemberListVo> getByMember(@Param("form")QueryTeamMemberRequest form);
@Select("<script>"
+ "select id accountId,real_name,department_id,roles from eb_system_admin where id not in (select account_id from t_team_member_relation "
+ "where 1=1"
+ "<if test = 'projectId!=\"\" and projectId !=null'> "
+ " and project_id=#{projectId} "
+ "</if>"
+ ") "
// 项目id
+ "<if test = 'departmentId!=\"\" and departmentId !=null'> "
+ "AND department_id = #{departmentId} "
+ "</if>"
+ "</script>")
List<TeamMemberVo> getTeamId(@Param("projectId")String projectId,@Param("departmentId")String departmentId);
}
package ProjectNode.java;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.TeamRecord;
import com.zrqx.olive.project.request.QueryTeamRequest;
import com.zrqx.olive.project.vo.TeamRecordListVo;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface TeamRecordDao extends BaseMapper<TeamRecord> {
@Select("<script>"
+ "select id,DATE_FORMAT(upload_time,'%Y-%m-%d %H:%i:%s') upload_time,describes FROM t_team_record where 1=1 "
+ "<if test = 'form.oid!=\"\" and form.oid!=null'> "
+ " AND team_id =#{form.oid} "
+ "</if>"
+ "<if test = 'form.projectId!=\"\" and form.projectId!=null'> "
+ " AND project_id =#{form.projectId} "
+ "</if>"
+ " order by upload_time DESC "
+ "</script>")
List<TeamRecordListVo> getRecordById(@Param("form")QueryTeamRequest form);
}
package com.zrqx.olive.personnel.controller;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
......@@ -25,6 +26,7 @@ import com.common.CheckAdminToken;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.taobao.api.ApiException;
import com.utils.DateUtils;
import com.zrqx.olive.personnel.dao.UserTaskLevelDao;
import com.zrqx.olive.personnel.model.UserScore;
......@@ -60,10 +62,10 @@ public class UserScoreController {
@Autowired
private TaskService taskService;
@Autowired
private UserTaskLevelService service;
@Autowired
private SystemAdminService systemAdminService;
@Autowired
private CheckAdminToken checkAdminToken;
@Autowired
private UserScoreService userScoreService;
@Autowired
private UserTaskLevelDao userTaskLevelDao;
......@@ -75,9 +77,9 @@ public class UserScoreController {
*/
@ApiOperation(value = "详情")
@RequestMapping(value = "/info", method = RequestMethod.GET)
@ApiImplicitParam(name = "id", value = "用户ID")
public CommonResult<UserScoreVo> info(@RequestParam(value = "id") Integer id,String date) {
UserScoreVo vo = userScoreService.info(id,date);
@ApiImplicitParam(name = "userId", value = "用户ID")
public CommonResult<UserScoreVo> info(@RequestParam(value = "userId") Integer userId,String date) throws ApiException, ParseException {
UserScoreVo vo = userScoreService.info(userId,date);
return CommonResult.success(vo);
}
......@@ -91,8 +93,16 @@ public class UserScoreController {
@ApiOperation(value = "历史记录")
@RequestMapping(value = "/recors", method = RequestMethod.GET)
@ApiImplicitParam(name = "id", value = "用户ID")
public CommonResult<UserScoreRecorsVo> recors(@RequestParam(value = "id") Integer id,String year) {
UserScoreRecorsVo vo = userScoreService.recors(id,year);
return CommonResult.success(vo);
public CommonResult<List<UserScoreRecorsVo>> recors(@RequestParam(value = "id") Integer id,String year) {
List<UserScoreRecorsVo> list = userScoreService.recors(id,year);
return CommonResult.success(list);
}
@ApiOperation(value = "提交审核")
@RequestMapping(value = "/check", method = RequestMethod.POST)
public CommonResult<Boolean> check(HttpServletRequest request) throws Exception{
String token = checkAdminToken.getTokenFormRequest(request);
SystemAdminResponse systemAdminResponse = systemAdminService.getInfoByToken(token);
userScoreService.check(systemAdminResponse);
return CommonResult.success();
}
}
package com.zrqx.olive.personnel.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
......@@ -15,18 +17,19 @@ public interface UserScoreDao extends BaseMapper<UserScore> {
+ " and user_id=#{id} "
+ "</if>"
+ "<if test = 'date!=null'>"
+ " AND a.generation_date = concat(#{beginDate}, ' 00:00:00' ) "
+ " AND a.generation_date = #{date}"
+ "</if>"
+ "</script>")
UserScore queryByInfo(@Param("id") Integer id, @Param("date") String date);
@Select("<script>"
+ "SELECT id,user_id,company_score,roles,generation_date from t_user_score a where 1=1 "
+ "SELECT id,user_id,roles,generation_date,total_score from t_user_score a where 1=1 "
+ "<if test = 'id!=null'> "
+ " and user_id=#{id} "
+ "</if>"
+ "<if test = 'year!=null'>"
+ " AND a.generation_date like concat(#{year}, '%' ) "
+ "</if>"
+ "order by generation_date asc"
+ "</script>")
UserScoreRecorsVo recors(Integer id, String year);
List<UserScoreRecorsVo> recors(@Param("id") Integer id,@Param("year") String year);
}
package com.zrqx.olive.personnel.response;
public class Constant {
/**
* 开发者后台->企业自建应用->选择您创建的E应用->查看->AppKey
*/
public static final String APP_KEY = "dingwesx1s7iuqh4anhu";
/**
* 开发者后台->企业自建应用->选择您创建的E应用->查看->AppSecret
*/
public static final String APP_SECRET="qkRYMu5MFh3M_croU4asvAIh1XM7QOm_-gtNjTWCwNx_y4_xoxVLYo7D9zl28GGk";
/**
* 应用agentId
*/
public static final long AGENT_ID = 616502456l;
//上班打卡id
public static final String COLUMN_ID_LIST = "90907566";
//下班打卡id
//public static final long COLUMN_ID_LIST = 90907571;
}
package com.zrqx.olive.personnel.service;
import java.text.ParseException;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.taobao.api.ApiException;
import com.zrqx.olive.personnel.model.UserScore;
import com.zrqx.olive.personnel.request.ScoreRequest;
import com.zrqx.olive.personnel.vo.UserScoreRecorsVo;
import com.zrqx.olive.personnel.vo.UserScoreVo;
import com.zrqx.olive.system.response.SystemAdminResponse;
public interface UserScoreService extends IService<UserScore> {
......@@ -12,9 +17,11 @@ public interface UserScoreService extends IService<UserScore> {
boolean saveOrUpdate(ScoreRequest scoreRequest);
UserScoreVo info(Integer id, String date);
UserScoreVo info(Integer id, String date) throws ApiException, ParseException ;
List<UserScoreRecorsVo> recors(Integer id, String year);
UserScoreRecorsVo recors(Integer id, String year);
Boolean check(SystemAdminResponse systemAdminResponse) throws ApiException;
......
package com.zrqx.olive.personnel.service.impl;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
......@@ -13,9 +15,20 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiAttendanceGetcolumnvalRequest;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.response.OapiAttendanceGetcolumnvalResponse;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.taobao.api.ApiException;
import com.utils.ArrayUtils;
import com.utils.DateUtil;
import com.utils.DateUtils;
import com.zrqx.olive.personnel.dao.UserTaskLevelDao;
import com.zrqx.olive.personnel.model.UserScore;
......@@ -27,6 +40,7 @@ import com.zrqx.olive.personnel.vo.UserScoreVo;
import com.zrqx.olive.system.dao.SystemAdminDao;
import com.zrqx.olive.system.model.SystemAdmin;
/**
* SystemAdminServiceImpl 接口实现
* +----------------------------------------------------------------------
......@@ -77,6 +91,5 @@ public class UserTaskLevelServiceImpl extends ServiceImpl<UserTaskLevelDao, User
public Integer getSumLevel(QueryLevelForm form) {
return mapper.getSumLevel(form);
}
}
......@@ -30,4 +30,8 @@ public class StatisticsTaskTime {
@ApiModelProperty("工时基准量")
private Integer taskLevel;
@ApiModelProperty("项目数量")
private Integer projectNumber;
}
package com.zrqx.olive.personnel.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class UserScoreDingVo {
@ApiModelProperty("迟到次数")
private Integer lateSum;
@ApiModelProperty("请假次数")
private Integer leaveSum;
}
......@@ -12,7 +12,6 @@ public class UserScoreRecorsVo {
private Integer id;
@ApiModelProperty("userId")
private Integer userId;
private BigDecimal companyScore;
@ApiModelProperty("总和")
private BigDecimal totalScore;
@ApiModelProperty(value = "后台管理员权限(menus_id)")
......
......@@ -54,13 +54,13 @@ public class DiyTypeController {
DiyType type=new DiyType();
BeanUtils.copyProperties(entity,type);
QueryWrapper<DiyType> qw = new QueryWrapper<>();
if(StringUtils.isNoneBlank(entity.getTypeName())) {
if(StringUtils.isNotBlank(entity.getTypeName())) {
qw.eq("type_name", entity.getTypeName());
}
if(StringUtils.isNoneBlank(entity.getProjectId())) {
if(StringUtils.isNotBlank(entity.getProjectId())) {
qw.eq("project_id", entity.getProjectId());
}
if(StringUtils.isNoneBlank(entity.getParentId())) {
if(StringUtils.isNotBlank(entity.getParentId())) {
qw.eq("parent_id", entity.getParentId());
}
List<DiyType> list = service.list(qw);
......@@ -68,7 +68,7 @@ public class DiyTypeController {
return CommonResult.failed("同级已存在"+entity.getTypeName());
}
QueryWrapper<DiyType> queryWrapper = new QueryWrapper<>();
if(StringUtils.isNoneBlank(entity.getProjectId())) {
if(StringUtils.isNotBlank(entity.getProjectId())) {
queryWrapper.eq("parent_id", entity.getParentId());
}
......@@ -97,16 +97,16 @@ public class DiyTypeController {
DiyType type = service.getById(entity.getId());
BeanUtils.copyProperties(entity,type);
QueryWrapper<DiyType> qw = new QueryWrapper<>();
if(StringUtils.isNoneBlank(entity.getTypeName())) {
if(StringUtils.isNotBlank(entity.getTypeName())) {
qw.eq("type_name", entity.getTypeName());
}
if(StringUtils.isNoneBlank(entity.getProjectId())) {
if(StringUtils.isNotBlank(entity.getProjectId())) {
qw.eq("project_id", entity.getProjectId());
}
if(StringUtils.isNoneBlank(entity.getParentId())) {
if(StringUtils.isNotBlank(entity.getParentId())) {
qw.eq("parent_id", entity.getParentId());
}
if(StringUtils.isNoneBlank(entity.getId())) {
if(StringUtils.isNotBlank(entity.getId())) {
qw.ne("id", entity.getId());
}
List<DiyType> list = service.list(qw);
......
......@@ -36,7 +36,6 @@ import com.zrqx.olive.project.vo.ProjectRecordListVo;
import com.zrqx.olive.project.vo.ProjectVo;
import com.zrqx.olive.system.response.SystemAdminResponse;
import com.zrqx.olive.system.service.SystemAdminService;
import com.zrqx.olive.timeApply.model.TimeApplyType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......
package com.zrqx.olive.project.controller;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.common.CommonResult;
import com.utils.Copy;
import com.utils.DateUtils;
import com.utils.UUIDUtil;
import com.zrqx.olive.project.model.ProjectNode;
import com.zrqx.olive.project.request.ProjectNodeListRequest;
import com.zrqx.olive.project.request.SaveProjectNodeRequest;
import com.zrqx.olive.project.request.UpdateProjectNodeDateRequest;
import com.zrqx.olive.project.request.UpdateProjectNodeRequest;
import com.zrqx.olive.project.service.ProjectNodeService;
import com.zrqx.olive.project.vo.ProjectNodeListVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("api/admin/projectNode")
@Api(tags = "项目管理--项目节点")
public class ProjectNodeController {
@Autowired
private ProjectNodeService service;
@ApiOperation(value = "新建任务清单", notes = "新建任务清单")
@PostMapping(value = "/save")
public CommonResult<Boolean> save(@RequestBody SaveProjectNodeRequest form) {
return service.saveProjectNode(form);
}
@ApiOperation(value = "完成状态", notes = "完成状态")
@PostMapping(value = "/status")
public CommonResult<String> status(@RequestBody UpdateProjectNodeRequest form) {
if(StringUtils.isNotBlank(form.getProjectId())) {
ProjectNode node = service.getById(form.getId());
node.setStatus(form.getStatus());
service.updateById(node);
}
return null ;
}
@ApiOperation(value = "截止时间", notes = "截止时间")
@PostMapping(value = "/endDate")
public CommonResult<String> endDate(@RequestBody UpdateProjectNodeDateRequest form) {
if(StringUtils.isNotBlank(form.getProjectId())) {
ProjectNode node = service.getById(form.getId());
Date time = DateUtils.strToDateTime(form.getDeadline(), DateUtils.DATE_FORMAT_YYYY_MM_DD);
node.setDeadline(time);
service.updateById(node);
}
return null ;
}
@ApiOperation(value = "新增自定义分类", notes = "新增一个")
@PostMapping(value = "/saveOrUpdate")
public CommonResult<Boolean> SaveOrUpdate(@RequestBody List<ProjectNodeListRequest> form) throws Exception {
if(form.size()>0) {
for (ProjectNodeListRequest entity : form) {
if (entity.getTaskName()==null || entity.getTaskName()=="") {
return CommonResult.failed("模块名称不能为空!");
}
if(entity.getId()==null) {
ProjectNode type=new ProjectNode();
BeanUtils.copyProperties(entity,type);
QueryWrapper<ProjectNode> queryWrapper = new QueryWrapper<>();
if(StringUtils.isNoneBlank(entity.getProjectId())) {
queryWrapper.eq("parent_id", entity.getParentId());
}
queryWrapper.orderByDesc("code");
List<ProjectNode> list1 = service.list(queryWrapper);
if(list1 != null && list1.size() > 0){
//查询到子分类,获取最大code生成新的code
String code = list1.get(0).getCode();
type.setCode(UUIDUtil.newCode(code));
}else{
//没有查询到子分类,获取父类code 拼接 01
if(!entity.getParentId().equals("0")){
type.setCode(service.getById(entity.getParentId()).getCode()+ "01");
}else{
type.setCode("01");
}
}
type.setCreateTime(new Date());
if(!service.save(type)){
return CommonResult.success("操作失败!");
}
}else {
ProjectNode type = service.getById(entity.getId());
BeanUtils.copyProperties(entity,type);
type.setCreateTime(new Date());
if(!service.updateById(type)){
return CommonResult.success("操作失败!");
}
}
}
}
return CommonResult.success(true);
}
@ApiOperation(value = "删除模块", notes = "删除模块")
@PostMapping(value = "delete")
public CommonResult<Boolean> delete(@RequestParam(value = "oid") String oid) {
ProjectNode diyType = service.getById(oid);
if(diyType.getPid().equals("0")) {
QueryWrapper<ProjectNode> qw = new QueryWrapper<>();
if(StringUtils.isNotBlank(oid)) {
qw.eq("parent_id", oid);
}
List<ProjectNode> list= service.list(qw);
if(list!=null && list.size()>0){
if(!service.remove(qw)) {
return CommonResult.success("操作失败!");
}
}
}
if(!service.removeById(oid)){
return CommonResult.success("操作失败!");
}
return CommonResult.success(true);
}
@ApiOperation(value = "查询根据ID自定义分类", notes = "根据ID查询")
@GetMapping(value = "getId")
public CommonResult<ProjectNode> getById(String oid) {
return CommonResult.success(service.getById(oid));
}
@ApiOperation(value = "查询全部模块tree", notes = "查询列表")
@GetMapping(value = "tree")
public CommonResult<List<ProjectNodeListVo>> tree(String projectId) {
QueryWrapper<ProjectNode> qw = new QueryWrapper<>();
if(StringUtils.isNoneBlank(projectId)) {
qw.eq("project_id", projectId);
}
qw.orderByAsc("sort");
List<ProjectNode> list = service.list(qw);
List<ProjectNodeListVo> voList = Copy.copyList(list , ProjectNodeListVo.class, obj -> obj.getParentId().equals("0"));
tree(list,voList);
return CommonResult.success(voList);
}
public List<ProjectNodeListVo> tree(List<ProjectNode> list,List<ProjectNodeListVo> voList){
voList.forEach(entity ->{
//第一次设置 一级分类的子类 后续递归设置 子类的子类
entity.setList(Copy.copyList(list, ProjectNodeListVo.class,obj -> obj.getParentId().equals(entity.getPid())));
//当前分类存在子类 开始递归子类
if(entity.getList().size() > 0){
tree(list, entity.getList());
}else{
entity.setList(null);
}
});
return voList;
}
}
package com.zrqx.olive.project.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zrqx.olive.project.model.DiyType;
import com.zrqx.olive.project.model.ProjectNode;
/**
* 自定义分类
*/
@Mapper
public interface ProjectNodeDao extends BaseMapper<ProjectNode> {
/**
* 查询排序号最大值
* @return
*/
@Select("select sort from t_diyType where parent_id = #{id} order by sort desc limit 1")
Integer getMaxOrderNum(String id);
/**
* 修改排序号
* @return
*/
@Update("update t_diyType set sort = #{sort} where parent_id = #{id}")
Integer updateSortByPrimaryKey(@Param("sort")Integer sort,@Param("id")String id);
@Select("<script>"
+ "select * from t_diyType where"
+ " parent_id = '0' ORDER BY create_time ASC "
+ "</script>")
List<DiyType> queryByDiyType();
/**
* 通过id集合查询分类
* @param ids
* @return
* @author rjc
* @date: 2019年3月22日 上午11:40:20
*/
@Select("<script>"
+ "select * from t_diyType a "
+ "where 1=1 "
+ "and id in "
+ " <foreach collection=\"ids\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">"
+ "#{id}"
+ "</foreach>"
+ "</script>")
List<ProjectNode> queryByDiytypelId(@Param("ids") List<String> ids);
}
......@@ -51,7 +51,7 @@ public interface StatisticsProjectDao extends BaseMapper<StatisticsProject> {
+ "</script>")
Integer selectByMaxSort();
@Select("<script>"
+ "select a.id,project,px FROM t_statistics_project a "
+ "select a.id,project,px,status FROM t_statistics_project a "
+ "<if test = 'roles ==11 or roles ==12 or roles ==13'> "
+ "INNER JOIN t_team_member_relation b on a.id=b.project_id where 1=1 and b.account_id =#{user_Id} "
+ "</if>"
......@@ -61,6 +61,10 @@ public interface StatisticsProjectDao extends BaseMapper<StatisticsProject> {
+ "<if test = 'form.project !=\"\" and form.project !=null'> "
+ "AND project like concat('%',#{form.project},'%')"
+ "</if>"
+ "<if test = 'form.presale!=null'> "
+ " AND presale = #{form.presale} "
+ "</if>"
+ " order by start_time desc,px desc"
+ "</script>")
List<ProjectListVo1> list(@Param("form") QueryProjectRequest form, @Param("roles") Integer roles,@Param("user_Id") Integer user_Id);
@Select("<script>"
......
package com.zrqx.olive.project.model;
import java.util.Date;
import org.springframework.data.annotation.Id;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_project_node")
@ApiModel(value="T_ProjectNode对象", description="添加项目节点")
public class ProjectNode {
@Id
@TableId(value = "id", type = IdType.ASSIGN_UUID)
@ApiModelProperty("自定义分类id,新增时不需要填写")
private Integer id;
@ApiModelProperty("分类pid,新增时不需要填写")
private Integer pid;
@ApiModelProperty(value = "分类名称")
private String taskName;
@ApiModelProperty(value = "负责人")
private String principal;
@ApiModelProperty(value = "父类id")
private Integer parentId;
@ApiModelProperty(value = "排序号")
private Integer sort;
@ApiModelProperty(value = "分类编号")
private String code;
@ApiModelProperty(value = "截止时间")
private Date deadline;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty("项目Id")
private String projectId;
@ApiModelProperty(value = "状态 0:未完成 1:已完成")
private Integer status;
}
package com.zrqx.olive.project.request;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ProjectNodeListRequest对象", description="项目节点")
public class ProjectNodeListRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("分类id,新增时不需要填写")
private Integer id;
@ApiModelProperty("分类pid")
private Integer pid;
@ApiModelProperty(value = "分类名称")
private String taskName;
@ApiModelProperty(value = "负责人")
private String principal;
@ApiModelProperty(value = "父类id")
private Integer parentId;
@ApiModelProperty(value = "排序号")
private Integer sort;
@ApiModelProperty(value = "分类编号")
private String code;
@ApiModelProperty("项目Id")
private String projectId;
@ApiModelProperty(value = "状态 0:未完成 1:已完成")
private Integer status;
}
package com.zrqx.olive.project.request;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SaveProjectNodeRequest对象", description="项目节点")
public class SaveProjectNodeRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("项目Id")
private String projectId;
@ApiModelProperty(value = "项目节点")
private List<ProjectNodeListRequest> menuListData;
}
package com.zrqx.olive.project.request;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="UpdateProjectNodeDateRequest对象", description="项目管理表")
public class UpdateProjectNodeDateRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("分类id,新增时不需要填写")
private Integer id;
@ApiModelProperty("项目id")
private String projectId;
@ApiModelProperty(value = "截止时间")
private String deadline;
}
package com.zrqx.olive.project.request;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="UpdateProjectNodeRequest对象", description="项目管理表")
public class UpdateProjectNodeRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("分类id,新增时不需要填写")
private Integer id;
@ApiModelProperty("项目id")
private String projectId;
@ApiModelProperty(value = "状态 0:未完成 1:已完成")
private Integer status;
}
package com.zrqx.olive.project.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.CommonResult;
import com.zrqx.olive.project.model.ProjectNode;
import com.zrqx.olive.project.request.SaveProjectNodeRequest;
/**
*
* 自定义分类service
*/
public interface ProjectNodeService extends IService<ProjectNode>{
/**
* 查询当前最大排序号
* @param id
* @return
*/
Integer getMaxOrderNum(String id);
/**
* 修改排序
* @param ids
*/
void updateSortByPrimaryKey(List<String> ids);
/**
* 修改排序
* @param ids
*/
void updateSortByPrimaryKey(Integer sort,String id);
public List<ProjectNode> queryByDiytypelId(List<String> ids);
/**
* 新建任务清单
* @Title: ProjectNodeService.java
* @Package com.zrqx.olive.project.service
* @Description: TODO
* @author 任建彩
* @date 2021年10月14日
*/
CommonResult<Boolean> saveProjectNode(SaveProjectNodeRequest form);
}
package com.zrqx.olive.project.service.impl;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonResult;
import com.zrqx.olive.project.dao.ProjectNodeDao;
import com.zrqx.olive.project.model.ProjectNode;
import com.zrqx.olive.project.request.ProjectNodeListRequest;
import com.zrqx.olive.project.request.SaveProjectNodeRequest;
import com.zrqx.olive.project.service.ProjectNodeService;
/**
* 自定义分类
*/
@Service
public class ProjectNodeServiceImpl extends ServiceImpl<ProjectNodeDao,ProjectNode> implements ProjectNodeService {
@Autowired
private ProjectNodeDao mapper;
@Override
public Integer getMaxOrderNum(String id) {
Integer maxOrderNum = mapper.getMaxOrderNum(id);
return maxOrderNum == null ? 0 : maxOrderNum;
}
@Override
public void updateSortByPrimaryKey(List<String> ids) {
for (int i = 0; i < ids.size(); i++) {
mapper.updateSortByPrimaryKey(i, ids.get(i));
}
}
@Override
public void updateSortByPrimaryKey(Integer sort, String id) {
mapper.updateSortByPrimaryKey(sort, id);
}
@Override
public List<ProjectNode> queryByDiytypelId(List<String> ids) {
// TODO Auto-generated method stub
return mapper.queryByDiytypelId(ids);
}
@Override
public CommonResult<Boolean> saveProjectNode(SaveProjectNodeRequest form) {
// TODO Auto-generated method stub
if(StringUtils.isNotBlank(form.getProjectId())) {
for (ProjectNodeListRequest request : form.getMenuListData()) {
ProjectNode node = new ProjectNode();
BeanUtils.copyProperties(form, request);
node.setProjectId(form.getProjectId());
node.setCreateTime(new Date());
mapper.insert(node);
}
}
return CommonResult.success(true);
}
}
......@@ -11,4 +11,8 @@ public class ProjectListVo1 {
private String project;
@ApiModelProperty("排序")
private Integer px;
@ApiModelProperty("项目状态: 1项目启动、2需求分析、3项目开发、4系统测试、5部署试运行、6项目结项、7售后期、8已归档 ")
private String status;
@ApiModelProperty("项目状态:1项目启动、2需求分析、3项目开发、4系统测试、5部署试运行、6项目结项、7售后期、8已归档 ")
private String status_Name;
}
package com.zrqx.olive.project.vo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ProjectNodeListVo对象", description="项目节点")
public class ProjectNodeListVo implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty("分类id,新增时不需要填写")
private Integer id;
@ApiModelProperty("分类pid")
private Integer pid;
@ApiModelProperty(value = "分类名称")
private String taskName;
@ApiModelProperty(value = "负责人")
private String principal;
@ApiModelProperty(value = "父类id")
private Integer parentId;
@ApiModelProperty(value = "排序号")
private Integer sort;
@ApiModelProperty(value = "分类编号")
private String code;
@ApiModelProperty("项目Id")
private String projectId;
@ApiModelProperty(value = "状态 0:未完成 1:已完成")
private Integer status;
@ApiModelProperty(value = "子分类")
private List<ProjectNodeListVo> list = new ArrayList<ProjectNodeListVo>();
}
......@@ -96,4 +96,7 @@ public class SystemAdmin implements Serializable {
@ApiModelProperty("工时基准量")
private BigDecimal taskLevel;
@ApiModelProperty("dingdingUserId")
private String DDUserId;
}
......@@ -137,6 +137,9 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
if(StringUtils.isNotBlank(systemAdmin.getDepartmentId())){
lambdaQueryWrapper.eq(SystemAdmin::getDepartmentId, systemAdmin.getDepartmentId());
}
if(StringUtils.isNotBlank(systemAdmin.getIsType())){
lambdaQueryWrapper.eq(SystemAdmin::getIsType, systemAdmin.getIsType());
}
List<SystemAdmin> systemAdmins = dao.selectList(lambdaQueryWrapper);
List<SystemAdminResponse> systemAdminResponses = new ArrayList<>();
PageParamRequest pageRole = new PageParamRequest();
......
package com.zrqx.olive.test;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import javax.crypto.Mac;
......@@ -8,36 +9,100 @@ import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiAttendanceGetcolumnvalRequest;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiAttendanceGetcolumnvalResponse;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.utils.DateUtil;
import com.zrqx.olive.personnel.response.Constant;
public class Test {
@SuppressWarnings("unlikely-arg-type")
public static void main(String[] args) throws Exception{
//获取access_token
DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request1 = new OapiGettokenRequest();
request1.setAppkey(Constant.APP_KEY);
request1.setAppsecret(Constant.APP_SECRET);
request1.setHttpMethod("GET");
OapiGettokenResponse response = client1.execute(request1);
JSONObject jsonobj_result = JSON.parseObject(response.getBody());
String access_token = jsonobj_result.getString("access_token");
Long timestamp = System.currentTimeMillis();
String secret ="SECd4a6be1e02dc9864c688f283e3e0a2486d0f9211648a17b17d58dea331b15534";
String stringToSign = timestamp + "\n" + secret;
Mac mac =Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
request.setAgentId(Constant.AGENT_ID);
request.setUseridList("280858006520208618,192914220720207624");
request.setToAllUser(false);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("link");
msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
msg.getLink().setTitle("test");
msg.getLink().setText("test1234");
msg.getLink().setMessageUrl("test1");
msg.getLink().setPicUrl("http://test12.zhongdianyun.com/dingding.png");
request.setMsg(msg);
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, access_token);
System.out.println(rsp.getBody());
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=0ae8cbc485e8a22e12373e9806492adb134106b4b33a1e719a18ca2bfc1592aa&timestamp="+timestamp+"&sign="+sign+"");
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("link");
OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
link.setMessageUrl("http://test12.zhongdianyun.com/#/project_manage/toAudit");
link.setPicUrl("");
link.setTitle("中软启信管理系统");
link.setText("段思明提交了一个工时申请单,请您尽快审核!");
request.setLink(link);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("15011250677"));//设置@那些人,使用的是手机号
request.setAt(at);
OapiRobotSendResponse response = client.execute(request);
System.out.println(response.getErrcode());
/*获取打卡记录
* //获取考勤报表列值 DingTalkClient client2 =
* new DefaultDingTalkClient(
* "https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
* OapiAttendanceGetcolumnvalRequest req = new
* OapiAttendanceGetcolumnvalRequest(); SimpleDateFormat simpleDateFormat = new
* SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
* //req.setUserid(form.getUserId().toString());
* req.setUserid("280858006520208618");
* req.setColumnIdList(Constant.COLUMN_ID_LIST); String startDay =
* DateUtil.getLastMonthStartDay(); String endDay =
* DateUtil.getLastMonthEndDay();
* req.setFromDate(simpleDateFormat.parse(startDay));
* req.setToDate(simpleDateFormat.parse(endDay));
* OapiAttendanceGetcolumnvalResponse rsp = client2.execute(req, access_token);
* JSONObject result = JSON.parseObject(rsp.getBody()); JSONObject read =
* result.getJSONObject("result"); //JSONObject array =
* read.getJSONObject("column_vals"); JSONArray jsonArray =
* read.getJSONArray("column_vals").getJSONObject(0).getJSONArray("column_vals")
* ; int j=0; int a=0; for (int i=0; i<jsonArray.size(); i++) { String
* value=jsonArray.getJSONObject(i).getString("value");
* System.out.println(value); if(value.contains("迟到") && !value.contains("外勤"))
* { j++; } if(value.contains("事假")) { a++; } } System.out.println(j);
* System.out.println(rsp.getBody());
*/
/*群消息
* Long timestamp = System.currentTimeMillis(); String secret
* ="SECd4a6be1e02dc9864c688f283e3e0a2486d0f9211648a17b17d58dea331b15534";
*
* String stringToSign = timestamp + "\n" + secret; Mac mac
* =Mac.getInstance("HmacSHA256"); mac.init(new
* SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData =
* mac.doFinal(stringToSign.getBytes("UTF-8")); String sign =
* URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
*
* DingTalkClient client = new DefaultDingTalkClient(
* "https://oapi.dingtalk.com/robot/send?access_token=0ae8cbc485e8a22e12373e9806492adb134106b4b33a1e719a18ca2bfc1592aa&timestamp="
* +timestamp+"&sign="+sign+""); OapiRobotSendRequest request = new
* OapiRobotSendRequest(); request.setMsgtype("link"); OapiRobotSendRequest.Link
* link = new OapiRobotSendRequest.Link();
* link.setMessageUrl("http://test12.zhongdianyun.com/#/project_manage/toAudit")
* ; link.setPicUrl(""); link.setTitle("中软启信管理系统");
* link.setText("段思明提交了一个工时申请单,请您尽快审核!"); request.setLink(link);
* OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
* at.setAtMobiles(Arrays.asList("15011250677"));//设置@那些人,使用的是手机号
* request.setAt(at); OapiRobotSendResponse response = client.execute(request);
* System.out.println(response.getErrcode());
*/
}
}
......@@ -24,12 +24,17 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.enums.CheckStatusEnum;
import com.enums.ProjectStatusEnum;
......@@ -37,11 +42,14 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taobao.api.ApiException;
import com.utils.bean.BeanUtils;
import com.zrqx.olive.personnel.response.Constant;
import com.zrqx.olive.project.dao.StatisticsProjectDao;
import com.zrqx.olive.project.model.StatisticsProject;
import com.zrqx.olive.project.model.Team;
import com.zrqx.olive.project.service.StatisticsProjectService;
import com.zrqx.olive.project.service.TeamService;
import com.zrqx.olive.system.dao.SystemAdminDao;
import com.zrqx.olive.system.model.SystemAdmin;
import com.zrqx.olive.system.response.SystemAdminResponse;
import com.zrqx.olive.timeApply.dao.TimeApplyChangeDao;
import com.zrqx.olive.timeApply.model.TimeApplyChange;
......@@ -67,6 +75,8 @@ public class TimeApplyChangeServiceImpl extends ServiceImpl<TimeApplyChangeDao,T
private StatisticsProjectService projectService;
@Autowired
private TeamService teamService;
@Autowired
private SystemAdminDao systemAdminDao;
@Override
public PageInfo<TimeApplyVo> pageTimeApply(SystemAdminResponse request,PageParamRequest pageParamRequest) {
......@@ -260,12 +270,11 @@ public class TimeApplyChangeServiceImpl extends ServiceImpl<TimeApplyChangeDao,T
timeApplyChangeMapper.insert(form);
StatisticsProject project = projectDao.selectById(form.getProjectId());
project.setTotalApplyTime(form.getChangeTime());
//dingding(1,null,project.getProject(),null);
dingdingZf(1,null,project.getProject(),null);
return true;
}
@Override
public boolean updateChangeStatus(SystemAdminResponse systemAdminResponse,CheckTimeApplyStatusForm form) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException, ApiException {
// TODO Auto-generated method stub
String value = systemAdminResponse.getRealName();
TimeApplyChange entity = timeApplyChangeService.getById(form.getId());
if (StringUtils.isNotBlank(form.getStatus1())) {
......@@ -295,11 +304,47 @@ public class TimeApplyChangeServiceImpl extends ServiceImpl<TimeApplyChangeDao,T
teamService.updateById(team);
}
//dingding(2,value,project.getProject(),entity.getProjectId());
dingdingZf(2,value,project.getProject(),entity.getProjectId());
}
return true;
}
public void dingding(Integer type,String name,String project,String projectId) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, ApiException {
public void dingdingZf(Integer type,String name,String project,String projectId) throws ApiException {
DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request1 = new OapiGettokenRequest();
request1.setAppkey(Constant.APP_KEY);
request1.setAppsecret(Constant.APP_SECRET);
request1.setHttpMethod("GET");
OapiGettokenResponse response = client1.execute(request1);
JSONObject jsonobj_result = JSON.parseObject(response.getBody());
String access_token = jsonobj_result.getString("access_token");
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
request.setAgentId(Constant.AGENT_ID);
if(type==2) {
request.setUseridList("102055591027298533");
}
if(type==1) {
request.setUseridList("0766662809644858,0217504529598819");
}
request.setToAllUser(false);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("link");
msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
msg.getLink().setTitle("中软启信管理系统");
if(type==1) {
msg.getLink().setMessageUrl("http://test12.zhongdianyun.com/#/project_manage/toAudit");
msg.getLink().setText("段思明提交了《"+project+"》的工时申请单,请您尽快审核!");
}
if(type==2) {
msg.getLink().setMessageUrl("http://test12.zhongdianyun.com/#/project_manage/project/applyDetail?projectId="+projectId);
msg.getLink().setText(""+name+"已审核《"+project+"》的工时申请单!");
}
msg.getLink().setPicUrl("http://test12.zhongdianyun.com/dingding.png");
request.setMsg(msg);
}
public void dingdingQun(Integer type,String name,String project,String projectId) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, ApiException {
Long timestamp = System.currentTimeMillis();
String secret ="SECcffcbfac4d3cc71b47d00376f10118854ad1a984bd9376eda3013df131c58ed8";
//String secret ="SECd4a6be1e02dc9864c688f283e3e0a2486d0f9211648a17b17d58dea331b15534";
......
package com.zrqx.olive.ttask.controller;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.common.CheckAdminToken;
......@@ -10,24 +31,14 @@ import com.constants.Constants;
import com.utils.CrmebUtil;
import com.utils.DateUtil;
import com.utils.DateUtils;
import com.utils.ExportExcelTemplate;
import com.utils.ExportUtil;
import com.utils.ImportExcelUtil;
import com.utils.excelutil.BaseException;
import com.zrqx.olive.article.model.Article;
import com.zrqx.olive.article.request.ArticleRequest;
import com.zrqx.olive.article.request.ArticleSearchRequest;
import com.zrqx.olive.article.service.ArticleService;
import com.zrqx.olive.article.vo.ArticleVo;
import com.zrqx.olive.dept.model.Department;
import com.zrqx.olive.project.dao.ProjectFileDao;
import com.zrqx.olive.project.model.ProjectFile;
import com.zrqx.olive.project.model.Team;
import com.zrqx.olive.project.service.ProjectFileService;
import com.zrqx.olive.project.service.TeamService;
import com.zrqx.olive.system.response.SystemAdminResponse;
import com.zrqx.olive.system.service.SystemAdminService;
import com.zrqx.olive.system.service.SystemAttachmentService;
import com.zrqx.olive.system.service.SystemConfigService;
import com.zrqx.olive.ttask.model.Task;
import com.zrqx.olive.ttask.model.TaskRecord;
......@@ -36,36 +47,15 @@ import com.zrqx.olive.ttask.request.TaskRecordRequest;
import com.zrqx.olive.ttask.request.TaskRequest;
import com.zrqx.olive.ttask.service.TaskRecordService;
import com.zrqx.olive.ttask.service.TaskService;
import com.zrqx.olive.ttask.vo.ExcelTaskVo;
import com.zrqx.olive.ttask.vo.TaskExcelVo;
import com.zrqx.olive.ttask.vo.TaskRecordVo;
import com.zrqx.olive.ttask.vo.TaskVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* 任务管理表 前端控制器
* +---------------------------------------------------------------------- |
......
......@@ -89,6 +89,9 @@ public interface TaskDao extends BaseMapper<Task> {
+ "<if test = 'request.userId!=null'> "
+ " AND a.user_id = #{request.userId} "
+ "</if>"
+ "<if test = 'request.stage!=null'> "
+ " AND a.stage = #{request.stage} "
+ "</if>"
+ "<if test = 'request.taskDescription!=null'> "
+ " AND task_description like concat('%',#{request.taskDescription},'%') "
+ "</if>"
......@@ -330,7 +333,7 @@ public interface TaskDao extends BaseMapper<Task> {
+ " AND a.complete_Time &lt;= concat(#{form.endTime}, ' 23:59:59' ) "
+ "</if>"
+ "<if test = 'form.isType!=null'>"
+ " AND b.is_type = #{taskRequest.isType} "
+ " AND b.is_type = #{form.isType} "
+ "</if>"
+ "<if test = 'form.userId!=null'> "
+ " and b.id=#{form.userId} "
......@@ -358,7 +361,7 @@ public interface TaskDao extends BaseMapper<Task> {
List<DeptTotalInfoMonthVo> deptTotalInfoMonth();
@Select("<script>"
+ "SELECT SUM(working_hours) sumTime from t_task a where task_status=3 and task_type=1 "
+ "SELECT SUM(working_hours) sumTime from t_task a where task_status=3 and (task_type=1 or task_type=3) "
+ "<if test = 'id!=null'> "
+ " and user_id=#{id} "
+ "</if>"
......@@ -384,4 +387,21 @@ public interface TaskDao extends BaseMapper<Task> {
+ "</if>"
+ "</script>")
Integer getByCountBug(@Param("id") Integer id,@Param("beginDate") String beginDate,@Param("endDate") String endDate);
@Select("<script>"
+ "SELECT SUM(working_hours) totalTime,c.customer,c.project from t_task a INNER JOIN eb_system_admin b on a.user_id=b.id INNER JOIN t_statistics_project c on a.project_id = c.id where 1=1 "
+ "<if test = 'form.startTime!=null'>"
+ " AND a.complete_Time &gt;= concat(#{form.startTime}, ' 00:00:00' ) "
+ "</if>"
+ "<if test = 'form.endTime!=null'>"
+ " AND a.complete_Time &lt;= concat(#{form.endTime}, ' 23:59:59' ) "
+ "</if>"
+ "<if test = 'form.isType!=null'>"
+ " AND b.is_type = #{form.isType} "
+ "</if>"
+ "<if test = 'form.userId!=null'> "
+ " and b.id=#{form.userId} "
+ "</if>"
+ " and c.project NOT LIKE '%假期工时%' and c.project NOT LIKE '%项目外%' and a.task_status=3 GROUP BY project_id "
+ "</script>")
List<StatisticsTaskTimeSplit> queryProjectNumber(@Param("form") CompleteQueryForm form);
}
......@@ -73,7 +73,6 @@ public class Task implements Serializable {
@ApiModelProperty(value = "开始日期")
private Date endTime;
@ApiModelProperty(value = "任务状态 0:关闭 1:未完成 2:确认 3 已完成")
private Integer taskStatus;
......@@ -89,6 +88,9 @@ public class Task implements Serializable {
@ApiModelProperty(value = "1:任务管理 2:售前管理")
private Integer status;
@ApiModelProperty(value = "1:开发阶段 2:售后阶段")
private Integer stage;
@ApiModelProperty(value = "创建时间")
private Date createTime;
......
package com.zrqx.olive.ttask.request;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.zrqx.olive.project.model.ProjectFile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import org.springframework.data.annotation.Id;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.zrqx.olive.project.model.ProjectFile;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 任务管理 Request
......@@ -89,9 +84,12 @@ public class TaskRequest implements Serializable {
@ApiModelProperty(value = "售前项目id")
private String salesProjectId;
@ApiModelProperty(value = "1:任务管理 2:售前管理")
@ApiModelProperty(value = "任务类型 1:任务管理 2:售前管理")
private Integer status;
@ApiModelProperty(value = "所属阶段 1:开发阶段 2:售后阶段")
private Integer stage;
@ApiModelProperty(value = "创建时间")
private Date createTime;
......
......@@ -288,8 +288,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskDao, Task> implements TaskS
if(taskRequest.getStartTime()!=null && taskRequest.getEndTime()!=null) {
taskRequest.setUserId(statisticsTaskTime.getId());
Integer level = getLevel(taskRequest);
statisticsTaskTime.setTaskLevel(level);
CompleteQueryForm form = new CompleteQueryForm();
form.setStartTime(taskRequest.getStartTime());
form.setEndTime(taskRequest.getEndTime());
form.setUserId(statisticsTaskTime.getId().toString());
form.setIsType(taskRequest.getIsType());
List<StatisticsTaskTimeSplit> list2 = dao.queryProjectNumber(form);
statisticsTaskTime.setProjectNumber(list2.size());
}
}
return new PageInfo<StatisticsTaskTime>(list);
......
......@@ -104,7 +104,10 @@ public class TaskVo implements Serializable {
@ApiModelProperty(value = "1:任务管理 2:售前管理")
private Integer status;
@ApiModelProperty(value = "所属阶段 1:开发阶段 2:售后阶段")
private Integer stage;
@ApiModelProperty(value = "创建时间")
private String createTime;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论