Commit 890285e2 authored by nie'hong's avatar nie'hong

完善工时统计

parent 330253f7
package cn.wisenergy.common.config.multipleDatasource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
/**
* @description:
* @author: nh
* @create: 2021-04-20 10:25
**/
@Configuration
@MapperScan(basePackages = "cn.wisenergy.oaMapper", sqlSessionFactoryRef = "oaSqlSessionFactory")
public class OaDataSourceConfig {
@Bean("oaDataSource")
@ConfigurationProperties("spring.datasource.druid.one")
public DataSource dataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean("oaSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("oaDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath:/oaMapper/*Mapper.xml"));
//分页插件
Interceptor interceptor = new PageInterceptor();
Properties properties = new Properties();
//数据库
properties.setProperty("helperDialect", "mysql");
//是否将参数offset作为PageNum使用
properties.setProperty("offsetAsPageNum", "true");
//是否进行count查询
properties.setProperty("rowBoundsWithCount", "true");
//是否分页合理化
properties.setProperty("reasonable", "false");
interceptor.setProperties(properties);
bean.setPlugins(new Interceptor[] {interceptor});
return bean.getObject();
}
@Bean("oaSqlSessionTemplate")
public SqlSessionTemplate sqlSessionFactory(@Qualifier("oaSqlSessionFactory")SqlSessionFactory sqlSessionFactory ){
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("oaDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
package cn.wisenergy.common.config.multipleDatasource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @description:
* @author: nh
* @create: 2021-04-20 09:47
**/
@Configuration
@MapperScan(basePackages = "cn.wisenergy.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.two")
public DataSource primaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSession(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
// 扫描的mapper中有使用mybatis-plus这里需要使用MybatisSqlSessionFactoryBean 不然BaseMapper中的方法不会被加载
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
// bean.setConfigLocation(
// new PathMatchingResourcePatternResolver().getResource("classpath:MybatisConfig.xml"));
return bean.getObject();
}
@Bean("primarySqlSessionTemplate")
@Primary
public SqlSessionTemplate primaryJdbcTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory factory){
return new SqlSessionTemplate(factory);
}
@Bean
@Primary
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
......@@ -605,7 +605,7 @@ public class DateUtil {
* @return List
*/
public static List<Date> getDatesBetweenTwoDate(Date startDate, Date endDate) {
List<Date> dates = new ArrayList<Date>();
List<Date> dates = new ArrayList<>();
dates.add(startDate);// 把开始时间加入集合
Calendar cal = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
......@@ -813,7 +813,7 @@ public class DateUtil {
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
calendar.add(Calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
......
......@@ -16,7 +16,7 @@ public enum BASE_RESP_CODE_ENUM {
MEDIA_TYPE_NOT_ACCEPT("406", "无法接受请求中的媒体类型"),
REQUEST_TIME_OUT("408", "无法接受请求中的媒体类型"),
MEDIA_TYPE_NOT_SUPPORTED("415", "不支持的媒体类型"),
PLEASE_RE_LOGIN("444", "未登录或已下线,请重新登录"),
PLEASE_RE_LOGIN("444", "已下线,请重新登录"),
SERVER_ERROR("500", "获取数据异常"),
INPUT_PARAM_IS_NULL("600", "入参为空"),
WORK_ORDER_INFO_IS_NULL("601", "工单信息为空"),
......@@ -88,7 +88,13 @@ public enum BASE_RESP_CODE_ENUM {
ATLEASTONEADMINISTRATORISREQUIRED("670", "至少需要一个系统管理员!"),
PLEASESELECTANITEM("671", "请选择一个项目"),
PLEASESELECTADEPARTMENT("672","请选择一个部门"),
WECHAT_NOT_BIND("673","微信未绑定")
WECHAT_NOT_BIND("673","微信未绑定"),
DATE_HANDLE_ERROR("674", "数据处理出错"),
WORK_DAY_IS_REPEAT("675", "所选日期段内已有填报,请重新选择"),
LONG_LEAVE_TYPE_ERROR("676","填报长假/长休类型错误,只能填报请假和调休"),
LONG_LEAVE_DATE_NOT_ONLY_HOLIDAY("677", "长请假/调休不能只包含节假日"),
LONG_LEAVE_DATE_ERROR("678", "长请假/调休所选择时间超出规定填报时间"),
NEW_PROJECT_OA_PROJECT_ID_OR_NAME_ERROR("679","新建项目/商机对应编号在OA中未找到")
;
......
......@@ -43,4 +43,14 @@ public interface WorkCollectMapper extends BaseMapper<WorkCollect> {
int updateStatusOrTotalTime(@Param("id") Integer id,@Param("status") Integer status,@Param("totalTime") Integer totalTime);
List<WorkCollect> getCompletedByUserIdAndMonth(@Param("userId") Integer userId, @Param("month") Date month);
/**
* 批量插入汇总
* @param workCollects
* @return
*/
int addManyLeaveCollect(@Param("workCollects") List<WorkCollect> workCollects);
WorkCollect getWorkCollectByUserIdAndWorkDay(@Param("userId") Integer userId, @Param("workDay") Date workDay);
}
......@@ -30,4 +30,11 @@ public interface WorkDeptMapper extends BaseMapper<WorkDept> {
List<WorkDept> getDeptByManagerId(Integer userId);
List<DeptOfProjectAndOrderType> getDeptOfProjectAndOrderType(@Param("userId") Integer userId, @Param("deptId") Integer deptId);
/**
* 根据用户主键查询所在部门的oa编号
* @param userId
* @return
*/
WorkDept getOaDeptNoByUserId(Integer userId);
}
package cn.wisenergy.mapper;
import cn.wisenergy.model.app.WorkLeave;
import java.util.List;
public interface WorkLeaveMapper {
int insert(WorkLeave workLeave);
List<WorkLeave> getListByUserId(Integer userId);
}
......@@ -68,4 +68,16 @@ public interface WorkProjectMapper extends BaseMapper<WorkProject> {
* 工单变更,获取管理员所管理的项目/商机和参与人员
*/
List<OrderChangeTypeDto> getOrderChangeTypeDtos(Integer userId);
/**
* 获取项目/商机集合
* @param deptId
* @param typeId
* @param projectNameOrNo 项目的oa编号或名称模糊查询
* @return
*/
List<WorkProject> getListByDeptAndType(@Param("deptId") Integer deptId, @Param("typeId") Integer typeId, @Param("projectNameOrNo") String projectNameOrNo);
WorkProject getByProjectNameOrOaId(@Param("projectName") String projectName, @Param("oaId") String oaId);
}
......@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface WorkSubmitAdoptMapper extends BaseMapper<WorkSubmitAdopt> {
}
......@@ -109,4 +109,10 @@ public interface WorkTimeOrderMapper extends BaseMapper<WorkTimeOrder> {
List<DeptUserCollectDto> getDeptNotOrderInfo(@Param("userId") Integer userId,@Param("depts") List<Integer> depts,@Param("startDate") Date startDate, @Param("endDate") Date endDate);
List<OrderChangePageDto> getOrderChangePage(OrderChangeLogMapperDto mapperDto);
List<ProjectWorkTimeStatisticsDto> getProjectStatisticsDetail(Map<String, Object> map);
int countByWorkDay(@Param("userId") Integer userId, @Param("startDate") String startDate, @Param("enbDate") String endDate);
int addManyLeaveOrder(@Param("workTimeOrders") List<WorkTimeOrder> workTimeOrders);
}
......@@ -58,4 +58,6 @@ public interface WorkUserMapper extends BaseMapper<WorkUser> {
WorkUser getUserByOpenId(String openid);
int clearOpenidByUserId(Integer userId);
List<WorkUser> getUserByIds(@Param("userIds") List<String> userIds);
}
package cn.wisenergy.oaMapper;
import cn.wisenergy.oaModel.OaProject;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @description: 项目和商机的mapper
* @author: nh
* @create: 2021-04-20 11:03
**/
public interface ProjectAndBoMapper {
List<OaProject> getListOaProjectByDept(@Param("oaDeptNo") String oaDeptNo,@Param("projectNameOrNo") String projectNameOrNo, @Param("oaProjectIds") List<String> oaProjectIds);
List<OaProject> getListOaBoByDept(@Param("oaDeptNo") String oaDeptNo ,@Param("projectNameOrNo") String projectNameOrNo, @Param("oaProjectIds") List<String> oaProjectIds);
OaProject getProjectByNameAndNo(Map<String, Object> map);
OaProject getBoByNameAndNo(Map<String, Object> map);
}
......@@ -41,6 +41,19 @@
<include refid="vals"/>
)
</insert>
<insert id="addManyLeaveCollect" keyProperty="id" useGeneratedKeys="true">
insert into
<include refid="table"/>
(<include refid="cols_exclude_id"/>)
values
<foreach collection="workCollects" item="workCollect" separator=",">
(#{workCollect.userId},#{workCollect.workDay},#{workCollect.totalTime},
#{workCollect.status},null,#{workCollect.createTime},#{workCollect.modifyTime}
)
</foreach>
</insert>
<update id="updateStatusOrTotalTime">
UPDATE
<include refid="table"/>
......@@ -94,4 +107,12 @@
</select>
<select id="getWorkCollectByUserIdAndWorkDay" resultType="cn.wisenergy.model.app.WorkCollect">
SELECT
<include refid="Base_Column_List"/>
FROM
<include refid="table"/>
where user_id = #{userId} and work_day = #{workDay}
</select>
</mapper>
......@@ -116,4 +116,10 @@ ORDER BY d.sort,p.id
</select>
<select id="getOaDeptNoByUserId" resultMap="BaseResultMap">
select d.id,<include refid="cols_exclude_id"/>
from work_dept d join work_user_dept ud on d.id = ud.dept_id
where ud.user_id = #{userId}
</select>
</mapper>
......@@ -23,8 +23,11 @@
<select id="getByDate" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where (year(day_start) = year(#{startDay}) AND month(day_start) = month(#{startDay})) OR
(year(day_end) = year(#{endDay}) AND month(day_end) = month(#{endDay}))
where (day_start >= #{startDay} and day_end &lt;= #{endDay}) OR
(day_start &lt;= #{startDay} and day_end >= #{endDay}) OR
(day_start >= #{startDay} and day_start &lt;= #{endDay}) OR
(day_end >= #{startDay} and day_end &lt;= #{endDay})
ORDER BY day_start
</select>
<select id="getByTypeAndStartDate" resultType="cn.wisenergy.model.app.WorkHoliday">
......
<?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="cn.wisenergy.mapper.WorkLeaveMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.wisenergy.model.app.WorkLeave">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="type_id" property="typeId"/>
<result column="start_date" property="startDate"/>
<result column="end_date" property="endDate"/>
<result column="des" property="des"/>
<result column="create_time" property="createTime"/>
<result column="modify_time" property="modifyTime"/>
</resultMap>
<sql id="vals">
#{id},#{userId},#{typeId},#{startDate},#{endDate},#{des},#{createTime},#{modifyTime}
</sql>
<sql id="cols_exclude_id">
user_id, type_id, start_date, end_date, des, create_time, modify_time
</sql>
<sql id="cols">
id,<include refid="cols_exclude_id"/>
</sql>
<sql id="table">
work_leave
</sql>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into <include refid="table"/>(<include refid="cols"/> )
value (<include refid="vals"/> )
</insert>
<select id="getListByUserId" resultMap="BaseResultMap">
select <include refid="cols"/>
from <include refid="table"/>
where user_id = #{userId}
order by start_date DESC
</select>
</mapper>
\ No newline at end of file
......@@ -54,9 +54,9 @@
OR u1.name like concat('%',#{userName},'%'))
</if>
)
</if>
</where>
ORDER BY oc.change_date desc
</if>
</where>
ORDER BY oc.change_date desc
</select>
</mapper>
\ No newline at end of file
......@@ -235,6 +235,7 @@
<if test="managerId != null and deptId == null">
AND manager_id = #{managerId}
</if>
<if test="year != null">
AND YEAR (create_time) &lt;= #{year} AND( year(conclusion_time) >= #{year} or is_conclusion = 1)
</if>
......@@ -306,5 +307,27 @@
ORDER BY t.sort,d1.sort,p.id
</select>
<select id="getListByOaIds" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where oa_project_id in
<foreach collection="oaProjectIds" item="oaProjectId" open="(" close=")" separator=",">
#{oaProjectId}
</foreach>
</select>
<select id="getListByDeptAndType" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where dept_id = #{deptId} AND type = #{typeId} AND (oa_project_id like CONCAT("%" ,#{projectNameOrNo},"%") OR project_name like CONCAT("%" ,#{projectNameOrNo},"%"))
</select>
<select id="getByProjectNameOrOaId" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where project_name = #{projectName} OR oa_project_id = #{oaId}
</select>
</mapper>
......@@ -138,6 +138,7 @@
</if>
</where>
group by <if test="projectId != null and projectIds == null"> project_name,</if> <if test="projectId == null and projectIds != null"> project_name,dept_name,</if>year(statistics_start),MONTH(statistics_start)
order by convert(project_name using gbk)
</select>
<select id="selectListStatistics" resultMap="projectStatisticsByMonth">
......@@ -167,7 +168,7 @@
</if>
</where>
group by ptc.project_id,project_name,year(statistics_start),MONTH(statistics_start) <if test="projectId != null || (projectIds != null and !isAll) "> ,d.dept_name</if> <if test="projectIds != null and isAll">,d.dept_name ,u.name </if>
order by convert(project_name using gbk)
</select>
<select id="selectListByOtherType" resultMap="workTimeAndCostCollect">
......
......@@ -2,17 +2,17 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wisenergy.mapper.WorkSubmitAdoptMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.wisenergy.model.app.WorkSubmitAdopt">
<id column="id" property="id" />
<result column="submit_time" property="submitTime" />
<result column="auto_adopt" property="autoAdopt" />
<result column="order_change" property="orderChange"></result>
</resultMap>
<!--&lt;!&ndash; 通用查询映射结果 &ndash;&gt;-->
<!--<resultMap id="BaseResultMap" type="cn.wisenergy.model.app.WorkSubmitAdopt">-->
<!--<id column="id" property="id" />-->
<!--<result column="submit_time" property="submitTime" />-->
<!--<result column="auto_adopt" property="autoAdopt" />-->
<!--<result column="order_change" property="orderChange"></result>-->
<!--</resultMap>-->
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, submit_time, auto_adopt,order_change
</sql>
<!--&lt;!&ndash; 通用查询结果列 &ndash;&gt;-->
<!--<sql id="Base_Column_List">-->
<!--id, submit_time, auto_adopt,order_change-->
<!--</sql>-->
</mapper>
......@@ -95,6 +95,14 @@
<result property="approved" column="approved"/>
</resultMap>
<resultMap id="ProjectWorkTimeStatisticsDto" type="cn.wisenergy.model.dto.ProjectWorkTimeStatisticsDto">
<result property="projectName" column="project_name"/>
<result property="username" column="name"/>
<!--<result property="userDept" column="user_dept"/>-->
<result property="normalTime" column="normal_time"/>
<result property="overTime" column="over_time"/>
</resultMap>
<sql id="table">
work_time_order
</sql>
......@@ -108,6 +116,20 @@
)
</insert>
<insert id="addManyLeaveOrder" useGeneratedKeys="true" keyProperty="workId">
insert into
<include refid="table"/>
(<include refid="cols_exclude_id"/>)
values
<foreach collection="workTimeOrders" item="workTimeOrder" separator=",">
(#{workTimeOrder.userId},
null,#{workTimeOrder.deptId},#{workTimeOrder.workTime},#{workTimeOrder.workDay},
#{workTimeOrder.status},null,#{workTimeOrder.des},null,#{workTimeOrder.type},#{workTimeOrder.isOvertime},
null,#{workTimeOrder.createTime},#{workTimeOrder.modifyTime}
)
</foreach>
</insert>
<update id="updateByIds">
UPDATE
......@@ -336,19 +358,17 @@
<where>
status IN (1,4)
AND TIMESTAMPDIFF(HOUR,create_time,now()) > #{autoExamine}
AND TIMESTAMPDIFF(DAY,work_day,now()) > (#{autoExamine}/24)
</where>
</select>
<select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject">
SELECT <if test="isAll">u.id AS user_id, u.`name` AS user_name, d.dept_name AS dept_name,</if>
<if test="!isAll">'合计' AS user_name ,</if> t.project_id AS project_id, t.type AS work_time_type, p.project_name
AS project_name,
IF(t.is_overtime = 0, <if test="!isAll">0</if>
<if test="isAll">null</if>, sum(t.work_time)) AS over_time, IF(t.is_overtime=1, <if test="!isAll">0</if>
<if test="isAll">null</if>, sum(t.work_time)) AS normal_time
<if test="!isAll">'合计' AS user_name ,</if> t.project_id AS project_id, t.type AS work_time_type, p.project_name AS project_name,
IF(t.is_overtime = 0, <if test="!isAll">0</if> <if test="isAll">null</if>, sum(t.work_time)) AS over_time,
IF(t.is_overtime=1, <if test="!isAll">0</if><if test="isAll">null</if>, sum(t.work_time)) AS normal_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id join work_type ty on t.type = ty.id join work_dept d on u.dept_id = d.id
where
t.status in (2,5) AND
......@@ -447,9 +467,47 @@
</where>
ORDER BY CONVERT( u.name USING gbk )
</select>
<select id="getProjectStatisticsDetail" resultMap="ProjectWorkTimeStatisticsDto">
SELECT t1.project_name,t1.name,if(sum(normal_time/8) is null,0,sum(normal_time/8)) AS normal_time,if(sum(over_time/8) is null,0,sum(over_time/8)) AS over_time
FROM (
SELECT project_name,u.name,sum(t.work_time) AS normal_time
FROM work_time_order t join work_user u on t.user_id = u.id
join work_project p on t.project_id = p.id
join work_type ty on t.type = ty.id
WHERE t.status in(2,5) AND is_overtime = 0 AND t.work_day>=#{startDate} AND t.work_day &lt;=#{endDate}
<if test="userId != null and deptId == null">
AND p.manager_id = #{userId}
</if>
<if test="deptId != null and userId == null">
AND p.dept_id = #{deptId}
</if>
<if test="deptId != null and userId != null">
AND (p.manager_id = #{userId} OR p.dept_id = #{deptId})
</if>
GROUP BY project_name,u.`name`
) t1 left join (
SELECT project_name,u.name,sum(t.work_time) AS over_time
FROM work_time_order t join work_user u on t.user_id = u.id
join work_project p on t.project_id = p.id
join work_type ty on t.type = ty.id
WHERE t.status in(2,5) AND is_overtime = 1 AND t.work_day>=#{startDate} AND t.work_day &lt;=#{endDate}
<if test="userId != null and deptId == null">
AND p.manager_id = #{userId}
</if>
<if test="deptId != null and userId == null">
AND p.dept_id = #{deptId}
</if>
<if test="deptId != null and userId != null">
AND (p.manager_id = #{userId} OR p.dept_id = #{deptId})
</if>
GROUP BY project_name,u.`name`
) t2 on t1.project_name = t2.project_name and t1.name = t2.name
GROUP BY t1.project_name,t1.`name`
ORDER BY CONVERT (t1.project_name USING gbk),CONVERT (t1. NAME USING gbk)
</select>
<select id="getOrderChangePage" resultType="cn.wisenergy.model.dto.OrderChangePageDto">
select o.work_id,o.project_id,p.project_name,u.name 'user_name',o.work_day,
o.work_time,t.name 'type_name',o.des,o.status
......@@ -495,6 +553,12 @@
</if>
</where>
ORDER BY o.work_day desc
ORDER BY o.work_day desc, o.create_time desc
</select>
<select id="countByWorkDay" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM work_time_order
WHERE work_day >= #{startDate} AND work_day &lt;= #{enbDate} AND user_id = #{userId}
</select>
</mapper>
......@@ -195,4 +195,15 @@ LEFT JOIN work_role r on ur.role_id = r.id
</where>
</select>
<select id="getUserByIds" resultMap="BaseResultMap">
select <include refid="cols_all"/>
from <include refid="table"/>
<where>
oa_user_id in
<foreach collection="userIds" separator="," open="(" close=")" item="userId">
#{userId}
</foreach>
</where>
</select>
</mapper>
<?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="cn.wisenergy.oaMapper.ProjectAndBoMapper">
<resultMap id="Project_Map" type="cn.wisenergy.oaModel.OaProject">
<id column="project_no" property="no"/>
<result property="name" column="project_name"/>
<result property="managerNo" column="pm_no"/>
<result property="bo" column="bo_no"/>
<result property="bName" column="bo_name"/>
<result property="managerName" column="manager_name"/>
<result property="deptNo" column="project_depart_no"/>
<result property="deptName" column="project_depart_name"/>
<result property="cost" column="cost"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
</resultMap>
<resultMap id="Bo_Map" type="cn.wisenergy.oaModel.OaProject">
<id column="project_no" property="no"/>
<result property="name" column="project_name"/>
<result property="managerNo" column="pm_no"/>
<result property="managerName" column="manager_name"/>
<result property="deptNo" column="project_depart_no"/>
<result property="deptName" column="project_depart_name"/>
<result property="cost" column="cost"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
</resultMap>
<sql id="values_project">
project_no, project_name ,pm_no ,bo_no ,bo_name ,manager_name,
project_depart_no ,project_depart_name ,cost,start_date ,end_date
</sql>
<sql id="values_bo">
bo, bo_name,pm_no,manager_name,project_depart_no,project_depart_name
</sql>
<select id="getListOaProjectByDept" resultMap="Project_Map">
select p.project_no, p.project_name, p.pm_no, p.project_depart_no, p.cost, p.start_date, p.end_date, b.bo_no, b.bo_name
from v_project_base p left join v_bo_base b on p.bo_no = b.bo_no
where p.project_depart_no = #{oaDeptNo}
AND (p.project_no like CONCAT("%" ,#{projectNameOrNo},"%") OR p.project_name like CONCAT("%" ,#{projectNameOrNo},"%"))
<if test="oaProjectIds.size != 0">
AND p.project_no not in
<foreach collection="oaProjectIds" item="oaProject" open="(" close=")" separator=",">
#{oaProject}
</foreach>
</if>
</select>
<select id="getListOaBoByDept" resultMap="Bo_Map">
select b.bo_no AS project_no, b.bo_name AS project_name, b.pm_no, b.pm_name, b.project_depart_no, b.project_depart_name
from v_project_base p right join v_bo_base b on p.bo_no = b.bo_no
where (b.project_depart_no = #{oaDeptNo} OR p.project_depart_no = #{oaDeptNo})
AND (b.bo_no like CONCAT("%" ,#{projectNameOrNo},"%") OR b.bo_name like CONCAT("%" ,#{projectNameOrNo},"%"))
<if test="oaProjectIds.size != 0">
AND b.bo_no not in
<foreach collection="oaProjectIds" item="oaProject" open="(" close=")" separator=",">
#{oaProject}
</foreach>
</if>
</select>
<select id="getProjectByNameAndNo" resultMap="Project_Map">
select <include refid="values_project"/>
from v_project_base
where project_no = #{projectNo} AND project_name = #{projectName}
<!--<if test="boNo != null ">-->
<!--AND bo_no = #{boNo} -->
<!--</if>-->
</select>
<select id="getBoByNameAndNo" resultMap="Bo_Map">
select bo_no AS project_no, bo_name AS project_name,pm_no,manager_name,project_depart_no,project_depart_name
from v_bo_base
where bo_no = #{projectNo} AND bo_name = #{projectName}
</select>
</mapper>
\ No newline at end of file
......@@ -23,38 +23,38 @@
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.baomidou</groupId>-->
<!--<artifactId>mybatis-plus-generator</artifactId>-->
<!--<version>3.4.0</version>-->
<!--<scope>test</scope>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>com.baomidou</groupId>-->
<!--<artifactId>mybatis-plus-annotation</artifactId>-->
<!--<version>3.4.0</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>com.baomidou</groupId>-->
<!--<artifactId>mybatis-plus-extension</artifactId>-->
<!--<version>3.4.0</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>com.baomidou</groupId>-->
<!--<artifactId>mybatis-plus-boot-starter</artifactId>-->
<!--<version>3.4.0</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
<scope>compile</scope>
</dependency>
<!--<dependency>-->
<!--<groupId>com.baomidou</groupId>-->
<!--<artifactId>mybatis-plus-generator</artifactId>-->
<!--<version>3.4.1</version>-->
<!--<scope>compile</scope>-->
<!--</dependency>-->
</dependencies>
<!-- MAVEN构建 -->
......
package cn.wisenergy.model.app;
import lombok.Data;
/**
* @description:
* @author: nh
* @create: 2021-04-14 09:47
**/
@Data
public class WorkLeave {
private Integer id;
private Integer userId;
private Integer typeId;
private String startDate;
private String endDate;
private String des;
private String createTime;
private String modifyTime;
}
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @description:
* @author: nh
* @create: 2021-04-14 10:22
**/
@Data
@ApiModel(value = "LeaveResult", description = "长假信息返回")
public class LeaveResult {
private String createTime;
private String typeName;
private String startDate;
private String endDate;
private String des;
}
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description: 项目工时统计接口参数
* @author: nh
* @create: 2021-04-13 17:10
**/
@Data
@ApiModel(value = "ProjectTimeStatisticsParam", description = "项目工时统计接口参数")
public class ProjectTimeStatisticsParam {
@ApiModelProperty(name = "userId", value = "用户主键")
private Integer userId;
@ApiModelProperty(name = "deptId", value = "部门主键")
private Integer deptId;
@ApiModelProperty(name = "startDate", value = "开始请假日期")
private String startDate;
@ApiModelProperty(name = "endDate", value = "结束请假日期")
private String endDate;
@ApiModelProperty(name = "currentPage", value = "当前页")
private Integer currentPage;
@ApiModelProperty(name = "pageSize", value = "页面信息数量")
private Integer pageSize;
}
......@@ -25,8 +25,6 @@ public class ProjectWorkTimeAndType{
@ApiModelProperty(name = "workTimeType", value = "项目类型")
private Integer workTimeType;
/**
* 加班工时
*/
......
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @description: 项目工时统计
* @author: nh
* @create: 2021-04-13 10:05
**/
@Data
@ApiModel(value = "ProjectWorkTimeStatisticsDto", description = "项目工时统计传输类")
public class ProjectWorkTimeStatisticsDto {
@ApiModelProperty(name = "projectName", value = "项目名称")
private String projectName;
// @ApiModelProperty(name = "userDept", value = "用户填报时部门")
// private String userDept;
@ApiModelProperty(name = "username", value = "用户姓名")
private String username;
@ApiModelProperty(name = "normalTime", value = "正常工时(人/天)")
private BigDecimal normalTime;
@ApiModelProperty(name = "overTime", value = "加班工时(人/天)")
private BigDecimal overTime;
}
package cn.wisenergy.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description:
* @author: nh
* @create: 2021-04-13 14:55
**/
@Data
@ApiModel(value = "小程序请长假请求参数")
public class TakeALongLeaveParam {
@ApiModelProperty(name = "userId", value = "用户主键")
private Integer userId;
@ApiModelProperty(name = "typeId", value = "类型")
private Integer typeId;
@ApiModelProperty(name = "startDate", value = "请假开始日期")
private String startDate;
@ApiModelProperty(name = "endDate", value = "请假结束日期")
private String endDate;
@ApiModelProperty(name = "des", value = "说明")
private String des;
}
......@@ -32,7 +32,7 @@ public class UserWorkTimeStatisticsByProject implements Serializable{
private String userName;
/**
* 用户部门名
* 用户部门名
*/
@ApiModelProperty(name = "userDeptName", value = "用户所在部门名称")
private String userDeptName;
......
......@@ -14,6 +14,7 @@ public enum LevelEnum {
ACCOUNTMANAGEMENT("账号管理"),
WORKORDER_CHANGEMANAGEMENT("工单变更管理"),
WORKORDER_CHANGERECORD("工单变更记录"),
PROJECT_STATISTICS_DETAIL("项目工时统计")
;
private String LevelName;
......
......@@ -10,9 +10,7 @@ public enum StatusEnum {
REJECTED(3, "被驳回"),
RE_SUBMIT(4,"重新填报"),
AUTOMATIC_AUDIT(5,"自动审批")
;
;
private Integer status;
private String msg;
......
......@@ -39,7 +39,7 @@ public class CreateProjectVo {
@ApiModelProperty(name = "workTime",value = "工时预算")
private BigDecimal workTime;
@ApiModelProperty(name = "costBudget",value = "成本预算,以为单位")
@ApiModelProperty(name = "costBudget",value = "成本预算,以为单位")
private BigDecimal costBudget;
@ApiModelProperty(name = "managerId",value = "项目经理userId")
......
package cn.wisenergy.oaModel;
import lombok.Data;
/**
* @description:
* @author: nh
* @create: 2021-04-20 10:43
**/
@Data
public class OaProject {
private String no;
private String name;
// 项目对应的商机oa编号
private String bo;
// 项目对应的商机名称,为商机时属性为空
private String bName;
private String managerNo;
private String managerName;
private String deptNo;
private String deptName;
private String startDate;
private String endDate;
private String cost;
}
package cn.wisenergy.oaService;
import cn.wisenergy.model.vo.CreateProjectVo;
import cn.wisenergy.oaModel.OaProject;
import java.util.List;
public interface OaProjectService {
/**
* 根据部门的oa编号和类型查询oa中的项目,typeId为1查询项目,为2查询商机
* @param oaDeptNo
* @param typeId
* @return
*/
List<OaProject> getListOaProject(String oaDeptNo, Integer typeId, String projectNameOrNo, List<String> oaProjectIds);
OaProject getOaProjectByNoAndName(CreateProjectVo createProjectVo);
}
package cn.wisenergy.oaService.impl;
import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM;
import cn.wisenergy.common.utils.exception.BaseCustomException;
import cn.wisenergy.model.vo.CreateProjectVo;
import cn.wisenergy.oaMapper.ProjectAndBoMapper;
import cn.wisenergy.oaModel.OaProject;
import cn.wisenergy.oaService.OaProjectService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author: nh
* @create: 2021-04-20 11:16
**/
@Service
@Slf4j
public class OaProjectServiceImpl implements OaProjectService {
@Autowired
private ProjectAndBoMapper projectAndBoMapper;
@Override
public List<OaProject> getListOaProject(String oaDeptNo, Integer typeId, String projectNameOrNo,List<String> oaProjectIds) {
log.info("OaProjectServiceImpl[]getListOaProject[]input.param{}oaDeptNo, typeId, projectNameOrNo, oaProjectIds =>" + oaDeptNo +"," + typeId + "," + projectNameOrNo + "," +oaProjectIds);
if (StringUtils.isEmpty(oaDeptNo) || typeId == null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
List<OaProject> listOaProject = null;
if (typeId.equals(1)) {
listOaProject = projectAndBoMapper.getListOaProjectByDept(oaDeptNo, projectNameOrNo,oaProjectIds);
}
if (typeId.equals(2)) {
listOaProject = projectAndBoMapper.getListOaBoByDept(oaDeptNo, projectNameOrNo,oaProjectIds);
}
return listOaProject;
}
@Override
public OaProject getOaProjectByNoAndName(CreateProjectVo createProjectVo) {
log.info("OaProjectServiceImpl[]getOaProjectByNoAndName[]input.param{}createProjectVo =>" + createProjectVo);
Map<String, Object> map = new HashMap<>();
// 项目/商机编号
map.put("projectNo", createProjectVo.getOaProjectId());
// 项目/商机名称
map.put("projectName", createProjectVo.getProjectName());
// 项目对应的商机不为空
if (createProjectVo.getBusinessId() != null) {
map.put("boNo", createProjectVo.getBusinessId());
map.put("boName", createProjectVo.getBusinessName());
}
OaProject oaProject;
// 项目
if (createProjectVo.getType() == 1) {
oaProject = projectAndBoMapper.getProjectByNameAndNo(map);
}else { // 商机
oaProject = projectAndBoMapper.getBoByNameAndNo(map);
}
return oaProject;
}
}
package cn.wisenergy.service;
import cn.wisenergy.model.dto.GetMonthlyCollectParam;
import cn.wisenergy.model.dto.ProjectStatisticsByMonth;
import cn.wisenergy.model.dto.UserWorkTimeStatisticsByProject;
import cn.wisenergy.model.dto.WorkTimeAndCostCollect;
import cn.wisenergy.model.dto.*;
import com.github.pagehelper.PageInfo;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
......@@ -78,7 +75,7 @@ public interface StatisticsService {
HSSFWorkbook exportUserStatistics(Integer userId, Integer deptId, String startDate, String endDate);
/**
* 导出项目工时统计
* 导出项目统计
* @param userId
* @param year
* @param projectIds
......@@ -93,4 +90,18 @@ public interface StatisticsService {
* @return
*/
List<Date> currentMonthWorkDays(Date date, boolean toToday);
/**
* 获取项目下所有人在指定时间段内的加班工时和正常工时
* @param projectTimeStatisticsParam
* @return
*/
PageInfo getProjectStatisticsDetail(ProjectTimeStatisticsParam projectTimeStatisticsParam);
/**
* 导出项目工时统计
* @param projectTimeStatisticsParam
* @return
*/
HSSFWorkbook exportProjectTimeStatistics(ProjectTimeStatisticsParam projectTimeStatisticsParam);
}
......@@ -80,4 +80,6 @@ public interface WorkProjectService {
OrderChangeDto getProjectAndOrderTypeAndDept(Integer userId);
List<DeptOfProjectAndOrderType> getProjectOfFind(Integer userId);
PageInfo queryOaProject(Integer userId, Integer typeId, String projectNameOrNo, Integer currentPage, Integer pageSize);
}
......@@ -142,4 +142,26 @@ public interface WorkTimeOrderService {
Boolean deleteOrderChange(Integer workId, Integer operator,String changeReason);
/**
* 请长假
* @param takeALongLeaveParam
* @return
*/
Boolean takeALongLeave(TakeALongLeaveParam takeALongLeaveParam);
/**
* 返回用户长假或长调休信息
* @param userId
* @return
*/
List<LeaveResult> getUserLongLeaveInfo(Integer userId);
/**
* 时间段内的节假日天数
* @param startDate
* @param endDate
* @return
*/
Integer getHolidayCountWithTimePeriod(String startDate, String endDate);
}
......@@ -158,6 +158,10 @@ public class WorkCollectServiceImpl implements WorkCollectService {
if (null == workCollect) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
WorkCollect workCollectByUserIdAndWorkDay = workCollectMapper.getWorkCollectByUserIdAndWorkDay(workCollect.getUserId(), workCollect.getWorkDay());
if (workCollectByUserIdAndWorkDay != null) {
workCollectMapper.deleteById(workCollectByUserIdAndWorkDay.getId());
}
int insertRow = workCollectMapper.insertWorkCollect(workCollect);
if (insertRow == 0) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INSERT_DATA_IS_FAIL);
......
......@@ -3,10 +3,7 @@ package cn.wisenergy.service.impl;
import cn.wisenergy.common.utils.DateUtil;
import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM;
import cn.wisenergy.common.utils.exception.BaseCustomException;
import cn.wisenergy.mapper.WorkCentreMapper;
import cn.wisenergy.mapper.WorkDeptMapper;
import cn.wisenergy.mapper.WorkProjectChangeMapper;
import cn.wisenergy.mapper.WorkProjectMapper;
import cn.wisenergy.mapper.*;
import cn.wisenergy.model.app.*;
import cn.wisenergy.model.dto.*;
import cn.wisenergy.model.enums.LevelEnum;
......@@ -15,6 +12,8 @@ import cn.wisenergy.model.enums.ManagerEnum;
import cn.wisenergy.model.vo.CreateProjectVo;
import cn.wisenergy.model.vo.GetManagerProjectsVo;
import cn.wisenergy.model.vo.ModifyProjectVo;
import cn.wisenergy.oaModel.OaProject;
import cn.wisenergy.oaService.OaProjectService;
import cn.wisenergy.service.*;
import cn.wisenergy.service.utils.UserRoleLevelUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -29,7 +28,10 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
......@@ -71,6 +73,12 @@ public class WorkProjectServiceImpl implements WorkProjectService {
@Autowired
private WorkProjectChangeMapper workProjectChangeMapper;
@Autowired
private OaProjectService oaProjectService;
@Autowired
private WorkUserMapper workUserMapper;
/**
* 功能:根据项目id获取项目
*
......@@ -565,18 +573,33 @@ public class WorkProjectServiceImpl implements WorkProjectService {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.BUDGET_CANNOT_BELESSTHAN_ZERO);
}
// 判断oa编号、项目名称是否重复
List<WorkProject> workProjects = workProjectMapper.selectList(new QueryWrapper<>());
if (CollectionUtils.isEmpty(workProjects)) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.WORK_PROJECT_IS_NULL);
}
for (WorkProject workProject : workProjects) {
if (createProjectVo.getProjectName().equals(workProject.getProjectName())) {
WorkProject byProjectNameOrOaId = workProjectMapper.getByProjectNameOrOaId(createProjectVo.getProjectName(), createProjectVo.getOaProjectId());
if (byProjectNameOrOaId != null) {
if (createProjectVo.getProjectName().equals(byProjectNameOrOaId.getProjectName())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.DUPLICATEPROJECTNAME);
}
if (createProjectVo.getOaProjectId().equals(workProject.getOaProjectId())) {
if (createProjectVo.getOaProjectId().equals(byProjectNameOrOaId.getOaProjectId())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.ITEMOADUPLICATE);
}
}
// List<WorkProject> workProjects = workProjectMapper.selectList(new QueryWrapper<>());
// if (CollectionUtils.isEmpty(workProjects)) {
// throw new BaseCustomException(BASE_RESP_CODE_ENUM.WORK_PROJECT_IS_NULL);
// }
// for (WorkProject workProject : workProjects) {
// if (createProjectVo.getProjectName().equals(workProject.getProjectName())) {
// throw new BaseCustomException(BASE_RESP_CODE_ENUM.DUPLICATEPROJECTNAME);
// }
// if (createProjectVo.getOaProjectId().equals(workProject.getOaProjectId())) {
// throw new BaseCustomException(BASE_RESP_CODE_ENUM.ITEMOADUPLICATE);
// }
// }
// 在oa数据库中查找对应信息
// OaProject oaProject = oaProjectService.getOaProjectByNoAndName(createProjectVo);
// if (oaProject == null) {
// throw new BaseCustomException(BASE_RESP_CODE_ENUM.NEW_PROJECT_OA_PROJECT_ID_OR_NAME_ERROR);
// }
// 插入项目信息
Date date = new Date();
......@@ -758,6 +781,67 @@ public class WorkProjectServiceImpl implements WorkProjectService {
return orderChangeDto.getProjectAndOrderTypes();
}
@Override
public PageInfo queryOaProject(Integer userId, Integer typeId, String projectNameOrNo, Integer currentPage, Integer pageSize) {
log.info("WorkProjectServiceImpl[]queryOaProject[]input.param{}userId,typeId,projectNameOrNo" + userId + "," + typeId + "," + projectNameOrNo + "," + currentPage + "," + pageSize);
if (userId == null || typeId == null || StringUtils.isEmpty(projectNameOrNo)) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
// 项目/商机管理部门级权限能够新建项目/商机
// List<Integer> rankByUserAndLevelName = UserRoleLevelUtils.getRankByUserAndLevelName(userId, LevelEnum.PROJECT_MANAGER.getLevelName());
// if (!rankByUserAndLevelName.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank())) {
// throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTHORITY);
// }
// 根据用户id查询所对应oa部门编号
WorkDept oaDept = workDeptMapper.getOaDeptNoByUserId(userId);
// 查询工时系统中的该部门下的项目/商机
List<WorkProject> projectList = workProjectMapper.getListByDeptAndType(oaDept.getId(),typeId, projectNameOrNo);
List<String> oaProjectIds = projectList.stream().map(WorkProject::getOaProjectId).collect(Collectors.toList());
// 从oa中根据部门的oa编号查询项目/商机,
// typeId 为1 查询项目,为2查询商机
if (currentPage != null && pageSize != null) {
PageHelper.startPage(currentPage, pageSize);
}
List<OaProject> listOaProject = oaProjectService.getListOaProject(oaDept.getOaDeptId(), typeId, projectNameOrNo,oaProjectIds);
PageInfo<OaProject> pageInfo = new PageInfo<>(listOaProject);
if (CollectionUtils.isEmpty(listOaProject)) {
return null;
}
// 查询项目经理在工时系统中对应的id
List<String> managerIds = listOaProject.stream().map(OaProject::getManagerNo).collect(Collectors.toList());
List<WorkUser> workUsers = null;
if (!CollectionUtils.isEmpty(managerIds)) {
workUsers = workUserMapper.getUserByIds(managerIds);
}
// 将查询结果中的oa编号更换为工时系统中的编号
for (int i = 0; i < listOaProject.size(); i++) {
OaProject oaProject = listOaProject.get(i);
// 将部门oa编号替换为工时系统中的部门id
oaProject.setDeptNo(oaDept.getId().toString());
oaProject.setDeptName(oaDept.getDeptName());
// 将项目/商机负责人oa编号替换为工时系统中的用户id
if (StringUtils.isNotBlank(oaProject.getManagerNo())) {
assert workUsers != null;
for (WorkUser workUser : workUsers) {
if (workUser.getOaUserId().equals(oaProject.getManagerNo())) {
oaProject.setManagerNo(workUser.getId().toString());
oaProject.setManagerName(workUser.getName());
}
}
}
}
return pageInfo;
}
private PageInfo<ManagerProjectsDto> returnPageInfo(List<ManagerProjectsDto> managerProjectsDto) {
if (CollectionUtils.isEmpty(managerProjectsDto)) {
......
......@@ -33,6 +33,7 @@ import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
......@@ -69,6 +70,9 @@ public class WorkUserServiceImpl implements WorkUserService {
@Autowired
private WorkUserRoleMapper workUserRoleMapper;
@Autowired
private RedisTemplate redisTemplate;
private static final String LOGIN_SOURCE = "PC";
// 用户在职状态码
......@@ -240,6 +244,9 @@ public class WorkUserServiceImpl implements WorkUserService {
if (null == workUser) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.QUERY_DATA_IS_NULL);
}
// 清空该用在redis中的认证信息
WorkUser user = workUserMapper.getUserById(userId);
redisTemplate.delete("AuthenticationRedisCache" + user.getName());
WorkDept workDept = workDeptService.getById(workUser.getDeptId());
WorkCentre centre = workCentreService.getCentreById(workDept.getCentreId());
......@@ -313,6 +320,7 @@ public class WorkUserServiceImpl implements WorkUserService {
if (null == userId) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
// 验证用户是否存在
WorkUser user = workUserMapper.getUserById(userId);
WorkUser workUser = new WorkUser();
......@@ -320,6 +328,11 @@ public class WorkUserServiceImpl implements WorkUserService {
if (null == user) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.QUERY_USER_INFO_FAIL);
}
// 清空该用在redis中的认证信息
redisTemplate.delete("AuthenticationRedisCache" + user.getName());
// 重置密码
workUser.setPassword(Md5Util.digestMD5(user.getPhone()));
int i = workUserMapper.updateById(workUser);
return i > 0;
......
......@@ -74,7 +74,7 @@ public class ShiroConfig {
map.put("/swagger-resources/**","anon");
map.put("/v2/**","anon");
map.put("/static/**", "anon");
map.put("/**", "kickout");
// map.put("/**", "kickout");
map.put("/wxLogout", "wxLogout");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
......@@ -92,7 +92,7 @@ public class ShiroConfig {
}
@Bean(name = "realm")
public Realm getRealm(){
public CustomerRealm getRealm(){
CustomerRealm customerRealm = new CustomerRealm();
// 凭证校验匹配器
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
......@@ -142,6 +142,7 @@ public class ShiroConfig {
public KickoutSessionControlFilter kickoutSessionControlFilter(){
KickoutSessionControlFilter kickoutSessionControlFilter = new KickoutSessionControlFilter();
kickoutSessionControlFilter.setSessionManager(sessionManager());
kickoutSessionControlFilter.setCustomerRealm(getRealm());
return kickoutSessionControlFilter;
}
......
......@@ -3,9 +3,14 @@ package cn.wisenergy.shiro.filter;
import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM;
import cn.wisenergy.common.utils.exception.Result;
import cn.wisenergy.model.app.WorkUser;
import cn.wisenergy.shiro.util.CustomerRealm;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.session.mgt.SessionManager;
......@@ -34,8 +39,13 @@ import java.util.concurrent.TimeUnit;
public class KickoutSessionControlFilter extends AccessControlFilter {
protected Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private RedisTemplate redisTemplate;
private SessionManager sessionManager;
private CustomerRealm customerRealm;
// false为提出之前登录的用户
private boolean kickoutAfter = false;
......@@ -48,8 +58,9 @@ public class KickoutSessionControlFilter extends AccessControlFilter {
private static final long EXPIRE_TIME = 30 * 60;
@Autowired
private RedisTemplate redisTemplate;
public void setCustomerRealm(CustomerRealm customerRealm) {
this.customerRealm = customerRealm;
}
String getRedisKickoutKey(Integer userId) {
return keyprefix + userId;
......@@ -70,13 +81,26 @@ public class KickoutSessionControlFilter extends AccessControlFilter {
Subject subject = getSubject(request, response);
HttpServletResponse httpServletResponse = null;
// 没有登陆或没有设置“记住我”
// 没有登陆或没有设置“记住我”抛出未登录异常
if (!subject.isAuthenticated() && !subject.isRemembered()) {
// 没有登陆,抛出异常
httpServletResponse = (HttpServletResponse) response;
thrLogoutException(httpServletResponse, Result.RESULT_FLG.FAIL,BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN);
return false;
}
/** 刷新redis缓存认证信息,存在redis中的认证信息k为登录时写入usernamePasswordToken的username,
v为写入SimpleAuthenticationInfo中的principal **/
WorkUser principal = (WorkUser) subject.getPrincipal();
// 缓存管理
CacheManager cacheManager = customerRealm.getCacheManager();
// 缓存
Cache<Object, Object> cache = cacheManager.getCache(customerRealm.getAuthenticationCacheName());
// 覆盖,重新写入过期时间
AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(principal,principal.getPassword(),customerRealm.getName());
cache.put(principal.getLoginName(), authenticationInfo);
// 账号PC端只允许一位同时在线登录,做踢出用户操作
// 获取当前用户请求所携带的session
Session session = subject.getSession();
// 当前用户
......
......@@ -45,4 +45,7 @@ public class CustomerRealm extends AuthorizingRealm {
SimplePrincipalCollection newPrincipals = new SimplePrincipalCollection(user.getLoginName(), this.getName());
super.clearCachedAuthenticationInfo(newPrincipals);
}
}
package cn.wisenergy.shiro.util;
/**
* @description:
* @author: nh
* @create: 2021-04-11 23:45
**/
public class ExceptionUtil {
}
......@@ -38,10 +38,8 @@ public class ShiroSessionManager extends DefaultWebSessionManager {
}
}
@Override
public Session getSession(SessionKey key) throws SessionException {
return super.getSession(key);
}
}
package cn.wisenergy;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.ShiroAnnotationProcessorAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration;
import org.apache.shiro.spring.boot.autoconfigure.ShiroBeanAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
......@@ -15,9 +16,11 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
* 配置netty启动
*/
@EnableCaching
//排除原有的Multipart配置 spingboot接受不了multipartfile参数
@SpringBootApplication(exclude = {MultipartAutoConfiguration.class, ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class})
@MapperScan(basePackages = "cn.wisenergy.mapper")
//排除原有的Multipart配置 spingboot接受不了multipartfile参数;取消加载数据源自动配置
// MybatisPlusAutoConfiguration.class, DataSourceAutoConfiguration.class,
@SpringBootApplication(exclude = {MultipartAutoConfiguration.class, MybatisPlusAutoConfiguration.class, DataSourceAutoConfiguration.class, ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class})
//@MapperScan(basePackages = "cn.wisenergy.mapper")
//@ImportResource("classpath:mapper.*.xml")
@EnableSwagger2
@EnableScheduling
public class Application {
......
......@@ -4,10 +4,7 @@ import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM;
import cn.wisenergy.common.utils.exception.BaseCustomException;
import cn.wisenergy.common.utils.exception.Result;
import cn.wisenergy.model.app.WorkDept;
import cn.wisenergy.model.dto.GetMonthlyCollectParam;
import cn.wisenergy.model.dto.ProjectStatisticsByMonth;
import cn.wisenergy.model.dto.UserWorkTimeStatisticsByProject;
import cn.wisenergy.model.dto.WorkTimeAndCostCollect;
import cn.wisenergy.model.dto.*;
import cn.wisenergy.service.StatisticsService;
import cn.wisenergy.service.WorkDeptService;
import cn.wisenergy.web.admin.controller.common.BaseController;
......@@ -20,7 +17,9 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
......@@ -168,7 +167,7 @@ public class StatisticsController extends BaseController {
}
@ApiOperation(value = "导出项目统计明细", notes = "导出项目明细表")
@ApiOperation(value = "导出项目统计报表", notes = "导出项目明细表")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "用户主键"),
@ApiImplicitParam(name = "year", value = "统计年"),
......@@ -192,6 +191,45 @@ public class StatisticsController extends BaseController {
}
}
@ApiOperation(value = "项目工时统计", notes = "项目统计明细报表")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "用户主键"),
@ApiImplicitParam(name = "startDate", value = "起始统计日期"),
@ApiImplicitParam(name = "endDate", value = "结束统计日期"),
@ApiImplicitParam(name = "deptId", value = "部门主键,非中心不能选择")
})
@GetMapping("/getProjectStatisticsDetail")
public Result getProjectStatisticsDetail(ProjectTimeStatisticsParam projectTimeStatisticsParam){
log.info("StatisticsController[]getProjectStatisticsDetail[]input.param{}projectTimeStatisticsParam" + projectTimeStatisticsParam);
PageInfo projectStatisticsDetail = statisticsService.getProjectStatisticsDetail(projectTimeStatisticsParam);
return getResult(projectStatisticsDetail);
}
@ApiOperation(value = "导出项目工时统计", notes = "导出项目工时统计")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "用户主键"),
@ApiImplicitParam(name = "startDate", value = "起始统计日期"),
@ApiImplicitParam(name = "endDate", value = "结束统计日期"),
@ApiImplicitParam(name = "deptId", value = "部门主键,非中心不能选择")
})
@GetMapping("/exportProjectTimeStatistics")
public void exportProjectTimeStatistics(ProjectTimeStatisticsParam projectTimeStatisticsParam,HttpServletResponse response){
log.info("StatisticsController[]exportProjectTimeStatistics[]input.param{}projectTimeStatisticsParam" +projectTimeStatisticsParam);
HSSFWorkbook sheets = new HSSFWorkbook();
try {
sheets = statisticsService.exportProjectTimeStatistics(projectTimeStatisticsParam);
String fileName = "工时统计";
downExcel(response, sheets, fileName);
}finally {
try {
sheets.close();
} catch (IOException e) {
e.printStackTrace();
throw new BaseCustomException(BASE_RESP_CODE_ENUM.SERVER_ERROR);
}
}
}
// 导出Excel
public void downExcel(HttpServletResponse response, HSSFWorkbook sheets, String fileName) {
//响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着不想直接显示内容
......
......@@ -119,5 +119,17 @@ public class WorkProjectController extends BaseController {
return getResult(projectOfFind);
}
@ApiOperation(value = "查询oa中项目", notes = "查询oa中项目")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户主键"),
@ApiImplicitParam(name = "typeId", value = "类型主键"),
@ApiImplicitParam(name = "projectNameOrNo", value = "项目名称或oa编号")
})
@GetMapping("/queryOaProject")
public Result queryOaProject(Integer userId, Integer typeId, String projectNameOrNo, Integer currentPage, Integer pageSize){
log.info("WorkProjectController[]queryOaProject[]input.param{}userId,typeId,projectNameOrNo,currentPage,pageSize" + userId +"," + typeId + "," + projectNameOrNo + "," + currentPage + "," + pageSize);
PageInfo pageInfo = workProjectService.queryOaProject(userId, typeId, projectNameOrNo, currentPage, pageSize);
return getResult(pageInfo);
}
}
......@@ -221,4 +221,28 @@ public class WorkTimeOrderController extends BaseController {
return getResult(orderChangeLogPage);
}
@ApiOperation(value = "小程序长假/长调休填报", notes = "小程序长假/长调休填报")
@PostMapping("/takeALongLeave")
public Result takeALongLeave(TakeALongLeaveParam takeALongLeaveParam) {
log.info("WorkTimeOrderController[]takeALongLeave[]input.param" + takeALongLeaveParam);
Boolean isSuccess = workTimeOrderService.takeALongLeave(takeALongLeaveParam);
return getResult(isSuccess);
}
@ApiOperation(value = "获取用户长假/长调休信息", notes = "获取用户长假或长调休信息")
@GetMapping("/getUserLongLeaveInfo")
public Result getUserLongLeaveInfo(Integer userId) {
log.info("WorkTimeOrderController[]getLongLeaveInfo[]input.param{}userId" + userId);
List<LeaveResult> leaveResultList = workTimeOrderService.getUserLongLeaveInfo(userId);
return getResult(leaveResultList);
}
@ApiOperation(value = "获取时间段内节假日的天数", notes = "获取时间段内节假日的天数")
@GetMapping("getHolidayCountWithTimePeriod")
public Result getHolidayCountWithTimePeriod(String startDate, String endDate){
log.info("WorkTimeOrderController[]getHolidayCountWithTimePeriod[]input.param{}" + startDate + "," + endDate);
Integer daysCount = workTimeOrderService.getHolidayCountWithTimePeriod(startDate, endDate);
return getResult(daysCount);
}
}
......@@ -7,6 +7,7 @@ import cn.wisenergy.model.app.WorkSubmitAdopt;
import cn.wisenergy.model.app.WorkTimeOrder;
import cn.wisenergy.service.WorkCollectService;
import cn.wisenergy.service.WorkSubmitAdoptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
......@@ -24,6 +25,7 @@ import java.util.List;
@Component
@Configuration
@EnableScheduling
@Slf4j
public class Trigger implements SchedulingConfigurer {
@Autowired
......@@ -40,6 +42,7 @@ public class Trigger implements SchedulingConfigurer {
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
TriggerTask trigerTask = new TriggerTask(
() -> {
log.info("*******自动审批***********");
//这里写业务方法
WorkSubmitAdopt workSubmitAdopt = workSubmitAdoptService.getById(1);
Integer autoExamine = workSubmitAdopt.getAutoExamine();
......@@ -59,7 +62,8 @@ public class Trigger implements SchedulingConfigurer {
}
, triggerContext -> {
Integer autoAdopt = workSubmitAdoptService.getById(1).getAutoAdopt();
// Integer autoAdopt = workSubmitAdoptService.getById(1).getAutoAdopt();
Integer autoAdopt =1;
String time = "0 0 0 */" + autoAdopt + " * ?";
//返回执行的周期
return new CronTrigger(time).nextExecutionTime(triggerContext);
......
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.84:3306/work_test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: root
password: admin!@#123
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
#Oracle需要打开注释
#validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /druid/*
#login-username: admin
#login-password: admin
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
#文件上传配置
## 连接池配置
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
one:
## 数据源one配置
name: DBconfig1
url: jdbc:mysql://172.18.1.12:3306/view_wh?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: wh_read
password: 8ik,*IK<
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
two:
## 数据源two配置
name: DBconfig2
url: jdbc:mysql://192.168.110.84:3306/work_test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: root
password: admin!@#123
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# oa-datasource:
# type: com.alibaba.druid.pool.DruidDataSource
# druid:
# driver-class-name: com.mysql.cj.jdbc.Driver
# jdbc-url: jdbc:mysql://172.18.1.12:3306/view_wh?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
# username: wh_read
# password: 8ik,*IK<
# initial-size: 10
# max-active: 100
# min-idle: 10
# max-wait: 60000
# datasource:
# type: com.alibaba.druid.pool.DruidDataSource
# druid:
# driver-class-name: com.mysql.cj.jdbc.Driver
# jdbc-url: jdbc:mysql://192.168.110.84:3306/work_test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
# username: root
# password: admin!@#123
# initial-size: 10
# max-active: 100
# min-idle: 10
# max-wait: 60000
# # 打开PSCache,并且指定每个连接上PSCache的大小
# pool-prepared-statements: true
# max-pool-prepared-statement-per-connection-size: 20
# time-between-eviction-runs-millis: 60000
# min-evictable-idle-time-millis: 300000
# #Oracle需要打开注释
# #validation-query: SELECT 1 FROM DUAL
# test-while-idle: true
# test-on-borrow: false
# test-on-return: false
# stat-view-servlet:
# enabled: true
# url-pattern: /druid/*
# #login-username: admin
# #login-password: admin
# # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
# filter:
# stat:
# log-slow-sql: true
# slow-sql-millis: 1000
# merge-sql: false
# wall:
# config:
# multi-statement-allow: true
# #文件上传配置
servlet:
multipart:
# 启用
......@@ -44,19 +87,20 @@ spring:
# 总限制
max-request-size: 10MB
# redis:
# database: 0
# host: localhost
# port: 6379
# password: root # 密码(默认为空)
# timeout: 6000ms # 连接超时时长(毫秒)
# jedis:
# pool:
# max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
# max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
# max-idle: 10 # 连接池中的最大空闲连接
# min-idle: 5 # 连接池中的最小空闲连
###上传文件配置 :该配置可根据部署的系统或开发人员自定义路径,每次部署之前需要修改location
redis:
database: 0
host: 192.168.110.84
port: 6379
password: # 密码(默认为空)
timeout: 6000ms # 连接超时时长(毫秒)
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连
##上传文件配置 :该配置可根据部署的系统或开发人员自定义路径,每次部署之前需要修改location
uploadFile:
resourceHandler: /upload_flowChart/** #请求 url 中的资源映射也是保存到数据库中的父级路径
#location: D:/java/test/upload_flowChart/ #自定义上传文件服务器硬盘保存路径 ,linux服务器保存路径 /home/changfa/app/wxbjgkpt/upload_flowChart
......@@ -67,4 +111,10 @@ jwt:
# token有效时长,单位秒
expire: 14400
logging:
config: classpath:logback-spring.xml
\ No newline at end of file
config: classpath:logback-spring.xml
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
mybatis:
mapper-locations: classpath*:mapper/*.xml
#redis
\ No newline at end of file
......@@ -3,9 +3,10 @@ server:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 8080
port: 8086
connection-timeout: 5000ms
spring:
main:
allow-bean-definition-overriding: true
......@@ -26,27 +27,27 @@ spring:
# resources:
# add-mappings: false
#mybatis
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
#实体扫描,多个package用逗号或者分号分隔
#typeAliasesPackage: cn.wisenergy.service.*
global-config:
#数据库相关配置
db-config:
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: AUTO
#驼峰下划线转换
column-underline: true
logic-delete-value: -1
logic-not-delete-value: 0
banner: false
#原生配置
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
##mybatis
#mybatis-plus:
# mapper-locations: classpath*:mapper/*.xml
# #实体扫描,多个package用逗号或者分号分隔
# #typeAliasesPackage: cn.wisenergy.service.*
# global-config:
# #数据库相关配置
# db-config:
# #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
# id-type: AUTO
# #驼峰下划线转换
# column-underline: true
# logic-delete-value: -1
# logic-not-delete-value: 0
# banner: false
# #原生配置
# configuration:
# map-underscore-to-camel-case: true
# cache-enabled: false
# call-setters-on-nulls: true
# jdbc-type-for-null: 'null'
camera:
......@@ -63,8 +64,8 @@ camera:
appSecret: TDrCbqQXe9XSt7SimYDO
path: /artemis
mybatis:
mapper-locations: classpath:/mapper/*Mapper.xml
#mybatis:
# mapper-locations: classpath*:/mapper/*Mapper.xml
logging:
level:
cn.wisenergy.mapper : debug
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment