Browse Source

Merge branch 'test'

anderx 1 year ago
parent
commit
777e000593
55 changed files with 3012 additions and 1974 deletions
  1. 1 0
      pom.xml
  2. 1 1
      src/main/java/com/goafanti/RD/service/impl/RDServiceImpl.java
  3. 11 3
      src/main/java/com/goafanti/admin/bo/AdminCustomerBo.java
  4. 10 0
      src/main/java/com/goafanti/admin/bo/DepCountBo.java
  5. 6 1
      src/main/java/com/goafanti/admin/service/impl/AdminServiceImpl.java
  6. 4 4
      src/main/java/com/goafanti/common/controller/BaseController.java
  7. 3 0
      src/main/java/com/goafanti/common/dao/DepartmentMapper.java
  8. 2 0
      src/main/java/com/goafanti/common/dao/ExpenseAccountMapper.java
  9. 10 0
      src/main/java/com/goafanti/common/dao/TOrderNewMapper.java
  10. 2 2
      src/main/java/com/goafanti/common/dao/UserLockReleaseMapper.java
  11. 1 0
      src/main/java/com/goafanti/common/dao/UserMapper.java
  12. 4 5
      src/main/java/com/goafanti/common/dao/UserNamesMapper.java
  13. 25 59
      src/main/java/com/goafanti/common/mapper/AdminMapper.xml
  14. 3 3
      src/main/java/com/goafanti/common/mapper/DemandMapper.xml
  15. 7 0
      src/main/java/com/goafanti/common/mapper/DepartmentMapper.xml
  16. 73 19
      src/main/java/com/goafanti/common/mapper/ExpenseAccountMapper.xml
  17. 1 1
      src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml
  18. 1 1
      src/main/java/com/goafanti/common/mapper/TOrderMidMapper.xml
  19. 124 1
      src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml
  20. 2 2
      src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml
  21. 1481 1619
      src/main/java/com/goafanti/common/mapper/UserMapper.xml
  22. 3 1
      src/main/java/com/goafanti/common/mapper/UserMapperExt.xml
  23. 3 2
      src/main/java/com/goafanti/common/mapper/UserNamesMapper.xml
  24. 10 123
      src/main/java/com/goafanti/common/model/User.java
  25. 13 16
      src/main/java/com/goafanti/common/utils/AsyncUtils.java
  26. 5 19
      src/main/java/com/goafanti/common/utils/RedisUtil.java
  27. 60 6
      src/main/java/com/goafanti/common/utils/pdf/PDFUtils.java
  28. 1 0
      src/main/java/com/goafanti/core/cache/serializer/FastJsonRedisSerializer.java
  29. 4 9
      src/main/java/com/goafanti/customer/controller/AdminCustomerApiController.java
  30. 1 1
      src/main/java/com/goafanti/customer/service/CustomerService.java
  31. 15 8
      src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java
  32. 145 0
      src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsBo.java
  33. 134 0
      src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsDep.java
  34. 62 0
      src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsInput.java
  35. 155 0
      src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsOrder.java
  36. 12 0
      src/main/java/com/goafanti/expenseAccount/bo/InputDetailsListBo.java
  37. 12 0
      src/main/java/com/goafanti/expenseAccount/bo/InputPageListBo.java
  38. 14 0
      src/main/java/com/goafanti/expenseAccount/bo/MainExpenseAccount.java
  39. 29 7
      src/main/java/com/goafanti/expenseAccount/bo/SonExpenseAccount.java
  40. 19 0
      src/main/java/com/goafanti/expenseAccount/controller/ExpenseAccountController.java
  41. 66 0
      src/main/java/com/goafanti/expenseAccount/controller/ExpenseCountsController.java
  42. 3 0
      src/main/java/com/goafanti/expenseAccount/service/ExpenseAccountService.java
  43. 10 0
      src/main/java/com/goafanti/expenseAccount/service/ExpenseCountsService.java
  44. 251 41
      src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java
  45. 36 0
      src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseCountsServiceImpl.java
  46. 5 5
      src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java
  47. 19 1
      src/main/java/com/goafanti/order/service/impl/OrderProjectServiceImpl.java
  48. 10 0
      src/main/java/com/goafanti/organization/bo/InputDep.java
  49. 51 9
      src/main/java/com/goafanti/organization/service/impl/OrganizationServiceImpl.java
  50. 21 0
      src/main/java/com/goafanti/weChat/bo/OutPublicDtails.java
  51. 8 0
      src/main/java/com/goafanti/weChat/controller/AdminReleaseApiController.java
  52. 4 2
      src/main/java/com/goafanti/weChat/service/PublicReleaseService.java
  53. 53 0
      src/main/java/com/goafanti/weChat/service/impl/PublicReleaseServiceImpl.java
  54. 5 2
      src/main/resources/props/config_local.properties
  55. 1 1
      src/main/resources/props/config_test.properties

+ 1 - 0
pom.xml

@@ -456,6 +456,7 @@
 			<scope>compile</scope>
 		</dependency>
 
+
 	</dependencies>
 	<build>
 		<resources>

+ 1 - 1
src/main/java/com/goafanti/RD/service/impl/RDServiceImpl.java

@@ -187,7 +187,7 @@ public class RDServiceImpl extends BaseMybatisDao<RdDetailsMapper> implements RD
     public void pushDownloadDetailsPDF(Long id, HttpServletResponse response) {
         OutWordRdDetails data = getOutWordRdDetails(id);
         PDFUtils pdfUtils=new PDFUtils();
-        pdfUtils.pushPDF(data,response,uploadPath);
+        pdfUtils.pushRd(data,response,uploadPath);
     }
 
     private OutWordRdDetails getOutWordRdDetails(Long id) {

+ 11 - 3
src/main/java/com/goafanti/admin/bo/AdminCustomerBo.java

@@ -22,9 +22,17 @@ public class AdminCustomerBo {
 	private Integer channelCompleteCount;
 	/** 私有领取数 */
 	private Integer receiveCount;
-	
-	
-	
+	/** 私有转交数 */
+	private Integer transferCount;
+
+	public Integer getTransferCount() {
+		return transferCount;
+	}
+
+	public void setTransferCount(Integer transferCount) {
+		this.transferCount = transferCount;
+	}
+
 	public Integer getChannelCount() {
 		return channelCount;
 	}

+ 10 - 0
src/main/java/com/goafanti/admin/bo/DepCountBo.java

@@ -13,11 +13,20 @@ public class DepCountBo {
 	private Integer signCount;
 	private Integer channelCount;
 	private Integer newCount;
+	private Integer transferCount;
 	private Integer channelNewCount;
 	private Integer channelCompleteCount;
 	private List<DepCountBo> list;
 	private List<AdminCustomerBo> aList;
 
+	public Integer getTransferCount() {
+		return transferCount;
+	}
+
+	public void setTransferCount(Integer transferCount) {
+		this.transferCount = transferCount;
+	}
+
 	public DepCountBo() {
 		userCount = 0;
 		receiveCount = 0;
@@ -27,6 +36,7 @@ public class DepCountBo {
 		newCount = 0;
 		channelCompleteCount = 0;
 		channelNewCount = 0;
+		transferCount=0;
 		list=new ArrayList<>();
 		aList=new ArrayList<>();
 	}

+ 6 - 1
src/main/java/com/goafanti/admin/service/impl/AdminServiceImpl.java

@@ -444,6 +444,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 						admin.setNewCount(user.getNewCount());
 						admin.setChannelNewCount(user.getChannelNewCount());
 						admin.setReceiveCount(user.getReceiveCount());
+						admin.setTransferCount(user.getTransferCount());
 						break;
 					}
 				}
@@ -469,6 +470,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 		if (admin.getReceiveCount()==null) admin.setReceiveCount(0);
 		if (admin.getCompleteCount()==null) admin.setCompleteCount(0);
 		if (admin.getChannelCompleteCount()==null) admin.setChannelCompleteCount(0);
+		if (admin.getTransferCount()==null)admin.setTransferCount(0);
 	}
 
 	//迭代获取所有部门与部门员工并计算出部门数量
@@ -491,7 +493,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 	 * @param ab
 	 */
 	public void sumCount(DepCountBo ab) {
-		int completeCount=0,receiveCount=0,userCount=0,signCount=0,channelCount=0,newCount=0,channelNewCount=0,channelCompleteCount=0;
+		int completeCount=0,receiveCount=0,userCount=0,signCount=0,channelCount=0,newCount=0,channelNewCount=0,channelCompleteCount=0,transferCount=0;
 		if (ab.getList()!=null&&!ab.getList().isEmpty()) {
 			for (DepCountBo a : ab.getList()) {
 				if (a.getCompleteCount()!=null&& a.getCompleteCount()!=0) completeCount+=a.getCompleteCount();
@@ -502,6 +504,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 				if (a.getNewCount()!=null&& a.getNewCount()!=0) newCount+=a.getNewCount();
 				if (a.getChannelNewCount()!=null&& a.getChannelNewCount()!=0) channelNewCount+=a.getChannelNewCount();
 				if (a.getChannelCompleteCount()!=null&& a.getChannelCompleteCount()!=0) channelCompleteCount+=a.getChannelCompleteCount();
+				if (a.getTransferCount()!=null&& a.getTransferCount()!=0)transferCount+=a.getTransferCount();
 			}
 		}
 		if (ab.getaList()!=null&&!ab.getaList().isEmpty()) {
@@ -514,6 +517,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 				if (a.getNewCount()!=null&& a.getNewCount()!=0) newCount+=a.getNewCount();
 				if (a.getChannelNewCount()!=null&& a.getChannelNewCount()!=0) channelNewCount+=a.getChannelNewCount();
 				if (a.getChannelCompleteCount()!=null&& a.getChannelCompleteCount()!=0) channelCompleteCount+=a.getChannelCompleteCount();
+				if (a.getTransferCount()!=null&& a.getTransferCount()!=0)transferCount+=a.getTransferCount();
 			}
 		}
 		ab.setCompleteCount(completeCount);
@@ -524,6 +528,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 		ab.setNewCount(newCount);
 		ab.setChannelNewCount(channelNewCount);
 		ab.setChannelCompleteCount(channelCompleteCount);
+		ab.setTransferCount(transferCount);
 
 	}
 

+ 4 - 4
src/main/java/com/goafanti/common/controller/BaseController.java

@@ -135,9 +135,9 @@ public class BaseController {
 
 		}
 	}
-
+	private static String MyShiroList = "MyShiroList:";
 	private String getshiroList() {
-		String shiroList = redisUtil.getString(TokenManager.getAdminId());
+		String shiroList = redisUtil.getString(MyShiroList+TokenManager.getAdminId());
 		if (StringUtils.isBlank(shiroList)){
 			shiroList=shiroAddRedis();
 		}
@@ -150,7 +150,7 @@ public class BaseController {
 	 * 					8=技术员,9=技术经理,10=技术管理员,11=运营管理,12=总裁助理,13=总裁,14=董事长助理,15=董事长
 	 */
 	public String shiroAddRedis() {
-		redisUtil.deleteString(TokenManager.getAdminId());
+		redisUtil.deleteString(MyShiroList+TokenManager.getAdminId());
 		StringBuffer str= new StringBuffer();
 		if (TokenManager.hasRole(AFTConstants.SALESMAN))str.append(1).append(",");
 		if (TokenManager.hasRole(AFTConstants.SALESMAN_MANAGER))str.append(2).append(",");
@@ -172,7 +172,7 @@ public class BaseController {
 
 		if (str.length()<1)return "0";
 		String shiroList=str.substring(0,str.length()-1);
-		redisUtil.setString("shiroList",shiroList);
+		redisUtil.setString(MyShiroList+TokenManager.getAdminId(),shiroList);
 		return shiroList;
 	}
 

+ 3 - 0
src/main/java/com/goafanti/common/dao/DepartmentMapper.java

@@ -117,4 +117,7 @@ public interface DepartmentMapper {
     Department selectByDepNo(String superId);
 
     void updateDepFinance(@Param("aid") String aid, @Param("transferId") String transferId);
+
+
+    void updateOrderDepFinanceNotExamine(@Param("newFinanceId") String newFinanceId, @Param("useFinanceId") String useFinanceId);
 }

+ 2 - 0
src/main/java/com/goafanti/common/dao/ExpenseAccountMapper.java

@@ -72,4 +72,6 @@ public interface ExpenseAccountMapper {
     Integer selectDeleteIdBySonId(Integer integer);
 
     void updateSonTypeOther(@Param("id") Integer id, @Param("types") String types);
+
+    void updateRemoveOrderNo(ExpenseAccount ea);
 }

+ 10 - 0
src/main/java/com/goafanti/common/dao/TOrderNewMapper.java

@@ -4,6 +4,8 @@ import com.goafanti.common.model.Department;
 import com.goafanti.common.model.FinanceCount;
 import com.goafanti.common.model.TOrderBillNew;
 import com.goafanti.common.model.TOrderNew;
+import com.goafanti.expenseAccount.bo.ExpenseCountsBo;
+import com.goafanti.expenseAccount.bo.ExpenseCountsInput;
 import com.goafanti.order.bo.*;
 import com.goafanti.order.bo.outStatistics.OutOrderSalesSourceAmount;
 import com.goafanti.organization.bo.OrganizationListOut;
@@ -97,4 +99,12 @@ public interface TOrderNewMapper {
     OrganizationListOut selectOrderFinance(String orderNo);
 
     Department selectDepByOrderNo(String orderNo);
+
+    List<String> selectByFinanceNotExamine(String financeId);
+
+    void updateOrderDepFinanceExamineName(List<String> list);
+
+    List<ExpenseCountsBo> selectExpenseCount(ExpenseCountsInput in);
+
+    List<ExpenseCountsBo> selectExpenseDepCount(ExpenseCountsInput in);
 }

+ 2 - 2
src/main/java/com/goafanti/common/dao/UserLockReleaseMapper.java

@@ -4,10 +4,10 @@ import com.goafanti.common.bo.userDaysBo;
 import com.goafanti.common.model.UserLockRelease;
 import com.goafanti.common.model.UserLockReleaseExample;
 import com.goafanti.customer.bo.LockingReleaseBo;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
 import java.util.List;
-import org.apache.ibatis.annotations.Param;
 
 public interface UserLockReleaseMapper {
 
@@ -127,7 +127,7 @@ public interface UserLockReleaseMapper {
 
 	void updateReleaseUser(String orderNo);
 
-	void updateByAidAndUid(@Param("aid")String aid, @Param("uid")String uid);
+	void updateByAidAndUid( @Param("uid")String uid);
 
 	List<userDaysBo> selectChannelUserDays(@Param("days")Integer days, @Param("aid")String aid);
 

+ 1 - 0
src/main/java/com/goafanti/common/dao/UserMapper.java

@@ -20,6 +20,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface UserMapper {
+
     int deleteByPrimaryKey(String id);
 
     int insert(User record);

+ 4 - 5
src/main/java/com/goafanti/common/dao/UserNamesMapper.java

@@ -1,12 +1,11 @@
 package com.goafanti.common.dao;
 
-import java.util.List;
-
-import org.apache.ibatis.annotations.Param;
-
 import com.goafanti.common.model.UserNames;
 import com.goafanti.customer.bo.UserNamesListBo;
 import com.goafanti.user.bo.InputUserChannel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface UserNamesMapper {
     /**
@@ -61,7 +60,7 @@ public interface UserNamesMapper {
 
 	int updateAddUserName(@Param("uid") String uid, @Param("userName")String userName);
 
-	int checkUserName(String userName);
+    List<UserNamesListBo> checkUserName( @Param("userName")String userName);
 
 	void insertBatch(List<InputUserChannel> list);
 }

+ 25 - 59
src/main/java/com/goafanti/common/mapper/AdminMapper.xml

@@ -904,33 +904,23 @@
 
 
     <select id="selectAdminCustomerList"  resultType="com.goafanti.admin.bo.AdminCustomerBo">
-        select a.id as aid,a.name as aName,d.name as depName,ifnull(b.userCount,0) as userCount,ifnull(c.timeCount,0) as inputCount,
-        ifnull(d.timeCount,0) as receiveCount,ifnull(g.timeCount,0) as signCount from admin a
-        left join (select aid,count(aid) as userCount from user where aid is not null
-        and  share_type=0 and source in(1,2,3) and type=1 and new_channel=0
+        select a.id as aid,a.name as aName,d.name as depName,ifnull(b.userCount,0) as userCount,ifnull(c.inputCount,0) as newCount,
+        ifnull(c.receiveCount,0) as receiveCount,ifnull(b.signCount,0) as signCount,ifnull(c.transferCount,0) as transferCount
+        from admin a
+        left join (select aid, sum(if(share_type=0 and source in (1,2,3),1,0))userCount,
+        sum(if(share_type=2,1,0))signCount from `user` where   type=1  and new_channel=0
         group by aid) b on a.id=b.aid
-        left join (select aid,count(aid) as timeCount from `user` where aid is not null
-        and  share_type in (0,2) and source =1 and type=1 and new_channel=0
+        left join (select aid, sum(if(share_type=0 and source in (1),1,0))inputCount,
+        sum(if(share_type=0 and source in (3),1,0))transferCount, sum(if(share_type=0 and source in (2),1,0))receiveCount
+        from `user` where   type=1  and new_channel=0
         <if test="startTime != null and endTime != null">
             and  transfer_time  between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
         </if>
         group by aid) c on a.id=c.aid
-        left join (select aid,count(aid) as timeCount from `user` where aid is not null
-        and  share_type in (0,2) and source =2 and type=1 and new_channel=0
-        <if test="startTime != null and endTime != null">
-            and  transfer_time  between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
-        </if>
-        group by aid) d on a.id=d.aid
-        left join (select aid,count(aid) as timeCount from `user` where aid is not null
-        and share_type =2 and type=1  and new_channel=0
-        <if test="startTime != null and endTime != null">
-            and  transfer_time  between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
-        </if>
-        group by aid) g on a.id=g.aid
         left join department d on a.department_id=d.id
         left join user_role e on a.id=e.uid
         left join `role` f on e.rid=f.id
-        where f.role_name in ('营销员','营销经理')
+        where f.role_type in (96,996)
         and	 a.status= 0
         <if test="depId != null">
             and a.department_id =  #{depId,jdbcType=VARCHAR}
@@ -945,7 +935,7 @@
         left join department d on a.department_id=d.id
         left join user_role e on a.id=e.uid
         left join `role` f on e.rid=f.id
-        where f.role_name in ('营销员','营销经理')
+        where f.role_type in (96,996)
         and	 a.status= 0
         <if test="depId != null">
             and a.department_id =  #{depId,jdbcType=VARCHAR}
@@ -968,6 +958,13 @@
             )e on a.id=e.uid
         </if>
         where  a.type=1 and a.new_channel=0
+        <include refid="AdminCustomerDetailSql"/>
+        <if test="page_sql!=null">
+            ${page_sql}
+        </if>
+    </select>
+
+    <sql id="AdminCustomerDetailSql">
         <if test="type != 5 and type !=6">
             and a.aid=  #{aid,jdbcType=VARCHAR}
         </if>
@@ -980,7 +977,7 @@
         <if test="type == 1">
             and  a.share_type = 3
         </if>
-        <if test="type ==0  or type==3 or type==5 or type==7">
+        <if test="type ==0  or type==3 or type==5 or type==7 or type ==8">
             and a.channel=0
         </if>
         <if test="type == 1 or type==4 or type==6">
@@ -989,6 +986,7 @@
         <if test="type == 2">
             and a.share_type=2
         </if>
+
         <if test="type == 3 or type==4">
             and a.source=1
             and  a.share_type = 0
@@ -997,15 +995,16 @@
             and a.share_type = 0
             and a.source=2
         </if>
+        <if test="type == 8">
+            and  a.share_type = 0
+            and  a.source=3
+        </if>
         <if test="type!=5 and type!=6">
             <if test="startTime != null and endTime != null">
                 and  a.transfer_time between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
             </if>
         </if>
-        <if test="page_sql!=null">
-            ${page_sql}
-        </if>
-    </select>
+    </sql>
 
     <select id="selectAdminCustomerDetailCount" parameterType="java.lang.String" resultType="java.lang.Integer">
         select count(*)
@@ -1020,40 +1019,7 @@
             )e on a.id=e.uid
         </if>
         where  a.type=1 and a.new_channel=0
-        <if test="type != 5 and type !=6">
-            and a.aid=  #{aid,jdbcType=VARCHAR}
-        </if>
-        <if test="type == 5 or type ==6">
-            and e.aid=  #{aid,jdbcType=VARCHAR}
-        </if>
-        <if test="type == 0">
-            and  a.share_type = 0
-        </if>
-        <if test="type == 1">
-            and  a.share_type = 3
-        </if>
-        <if test="type ==0  or type==3 or type==5 or type==7">
-            and a.channel=0
-        </if>
-        <if test="type == 1 or type==4 or type==6">
-            and a.channel=1
-        </if>
-        <if test="type == 2">
-            and a.share_type=2
-        </if>
-        <if test="type == 3 or type==4">
-            and a.source=1
-            and  a.share_type = 0
-        </if>
-        <if test="type==7 ">
-            and a.share_type = 0
-            and a.source=2
-        </if>
-        <if test="type!=5 and type!=6">
-            <if test="startTime != null and endTime != null">
-                and  a.transfer_time between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
-            </if>
-        </if>
+       <include refid="AdminCustomerDetailSql"/>
     </select>
 
 

+ 3 - 3
src/main/java/com/goafanti/common/mapper/DemandMapper.xml

@@ -707,9 +707,9 @@
 	 <if test="hot != null and hot == 0"><!-- 不在首页 -->
 		,0 as hot
 	 </if>
-	 <if test="hot==null"><!-- 无首页参数 -->
-		,ifnull(mm.effective,0) as hot
-	 </if>
+<!--	 <if test="hot==null">&lt;!&ndash; 无首页参数 &ndash;&gt;-->
+<!--		,ifnull(mm.effective,0) as hot-->
+<!--	 </if>-->
 	from  demand d 
 	LEFT JOIN admin a on a.id = d.tech_broker_id
 	where d.deleted_sign = 0 

+ 7 - 0
src/main/java/com/goafanti/common/mapper/DepartmentMapper.xml

@@ -697,4 +697,11 @@
     where finance_id= #{aid}
   </update>
 
+  <update id="updateOrderDepFinanceNotExamine">
+    update t_order_examine a ,admin b
+    set a.aid=b.id , aname =b.name
+    where a.aid=#{newFinanceId} and a.status =0
+      and b.id= #{useFinanceId}
+  </update>
+
 </mapper>

+ 73 - 19
src/main/java/com/goafanti/common/mapper/ExpenseAccountMapper.xml

@@ -445,7 +445,7 @@
 
   <select id="selectExpenseAccountList" resultType="com.goafanti.expenseAccount.bo.OutExpenseAccountBo">
     select a.id,a.total_amount totalAmount,a.`type`,a.process_status processStatus,a.type_other typeOther,
-    a.attachment_url attachmentUrl ,a.real_amount realAmount,e.contract_no contractNo,tm.buyer_name buyerName,
+    a.attachment_url attachmentUrl ,a.real_amount realAmount,
     a.secondary_type secondaryType, a.secondary_type_other secondaryTypeOther,a.status,a.user_names userNames,
     date_format(a.release_start,'%Y-%m-%d %H:%i:%S')releaseStartStr,a.user_names userNames,a.amount,
     date_format(a.release_end,'%Y-%m-%d %H:%i:%S')releaseEndStr,
@@ -453,14 +453,14 @@
       eae.type eaeType,
     </if>
     <if test="expenseMain ==0">
-      mea.examine_name examineName,mea.check_no checkNo,mea.id mainId, a.target_type targetType,
-
+      mea.examine_name examineName,mea.check_no checkNo,mea.id mainId, a.target_type targetType,e.contract_no contractNo,tm.buyer_name buyerName,
     </if>
     <if test="expenseMain ==1">
        a.examine_name examineName,a.check_no checkNo,a.target_type targetType,
     </if>
     f.name depName,d2.name financeName, date_format(a.create_time,'%Y-%m-%d %H:%i:%S')createTimeStr,a.aname,
     b.name applyDepName, c.name payDepName
+
     from expense_account a
     <if test="type !=null">
       right join  (select a.id
@@ -473,15 +473,20 @@
       left join expense_relationship er on a.id=er.ea_id
       left join expense_account mea on  er.id=mea.id
       left join t_order_new e on a.order_no =e.order_no
+      left join t_order_mid  tm on e.order_no =tm.order_no
       left join department b on mea.apply_dep =b.id left join department c on mea.pay_dep =c.id
       left join admin d2 on b.expense_finance_id =d2.id
     </if>
     <if test="expenseMain ==1">
       left join department b on a.apply_dep =b.id left join department c on a.pay_dep =c.id
-      left join t_order_new e on a.order_no =e.order_no
+    <if test="contractNo !=null or username !=null">
+        left join expense_relationship er on a.id=er.id
+        left join expense_account sea on  er.ea_id=sea.id
+        left join t_order_new e on sea.order_no =e.order_no
+        left join t_order_mid  tm on e.order_no =tm.order_no
+    </if>
       left join admin d2 on b.expense_finance_id =d2.id
     </if>
-    left join t_order_mid  tm on e.order_no =tm.order_no
     <if test="processStatus ==1">
       inner join (select eaid ,auditor,min(process_status)`type` from expense_account_examine
       where auditor= #{auditor} group by eaid) eae on a.id=eae.eaid
@@ -494,6 +499,15 @@
   </select>
   <sql id="selectExpenseAccountSql">
     where 1=1
+    <if test="processStatus ==0">
+    and a.aid =#{auditor}
+      <if test="examineStatus ==1">
+        and a.status=1
+      </if>
+      <if test="examineStatus ==2">
+        and a.status in (2,3)
+      </if>
+    </if>
     <if test="processStatus ==1">
       and a.process_status>0
       <if test="examineStatus ==1">
@@ -511,6 +525,9 @@
         and a.process_status> 1
         and a.status in (1,2)
       </if>
+      <if test="roleType ==1">
+        and a.aid =#{auditor}
+      </if>
       <if test="examineStatus ==1">
       and a.process_status= 2
         and a.status=1
@@ -546,7 +563,12 @@
       </if>
     </if>
     <if test="username != null" >
-      and  a.user_names  like concat('%',#{username},'%')
+        <if test="expenseMain ==0">
+          and  a.user_names  like concat('%',#{username},'%')
+        </if>
+      <if test="expenseMain ==1">
+        and  sea.user_names  like concat('%',#{username},'%')
+      </if>
     </if>
     <if test="startTime !=null and endTime !=null">
       and a.create_time between #{startTime} and #{endTime}
@@ -580,15 +602,22 @@
       where c.`type` = #{type})x on a.id=x.id
     </if>
     left join admin d on a.aid =d.id left join department f on d.department_id =f.id
-    left join admin d2 on f.finance_id =d2.id
     <if test="expenseMain ==0">
       left join expense_relationship er on a.id=er.ea_id
       left join expense_account mea on  er.id=mea.id
-      left join t_order_new e on mea.order_no =e.order_no
+      left join t_order_new e on a.order_no =e.order_no
       left join department b on mea.apply_dep =b.id left join department c on mea.pay_dep =c.id
+      left join admin d2 on b.expense_finance_id =d2.id
     </if>
     <if test="expenseMain ==1">
       left join department b on a.apply_dep =b.id left join department c on a.pay_dep =c.id
+      <if test="contractNo !=null or username !=null">
+        left join expense_relationship er on a.id=er.id
+        left join expense_account sea on  er.ea_id=sea.id
+        left join t_order_new e on sea.order_no =e.order_no
+        left join t_order_mid  tm on e.order_no =tm.order_no
+      </if>
+      left join admin d2 on b.expense_finance_id =d2.id
     </if>
     <if test="processStatus ==1">
       inner join (select eaid ,auditor,min(process_status)`type` from expense_account_examine
@@ -610,12 +639,19 @@
     <if test="expenseMain ==0">
       left join expense_relationship er on a.id=er.ea_id
       left join expense_account mea on  er.id=mea.id
-      left join t_order_new e on mea.order_no =e.order_no
+      left join t_order_new e on a.order_no =e.order_no
       left join department b on mea.apply_dep =b.id left join department c on mea.pay_dep =c.id
+      left join admin d2 on b.expense_finance_id =d2.id
     </if>
     <if test="expenseMain ==1">
-      left join t_order_new e on a.order_no =e.order_no
       left join department b on a.apply_dep =b.id left join department c on a.pay_dep =c.id
+      <if test="contractNo !=null or username !=null">
+        left join expense_relationship er on a.id=er.id
+        left join expense_account sea on  er.ea_id=sea.id
+        left join t_order_new e on sea.order_no =e.order_no
+        left join t_order_mid  tm on e.order_no =tm.order_no
+      </if>
+      left join admin d2 on b.expense_finance_id =d2.id
     </if>
     <if test="processStatus ==1">
       inner join (select eaid ,auditor,min(process_status)`type` from expense_account_examine
@@ -707,7 +743,7 @@
 
 
   <select id="selectByMainId" resultMap="MainMap">
-    select b.id,b.check_no,b.total_amount,b.amount,b.aname,b.apply_dep,b.pay_dep,b.real_amount,b.type_other ,b.aid,
+    select b.id,b.check_no,b.total_amount,b.amount,b.aname,b.apply_dep,b.pay_dep,b.real_amount,b.type_other ,b.aid,b.create_time ,
            date_format(b.create_time,'%Y-%m-%d %H:%i:%S')createTimeStr,b.examine_name, dep.name applyDepName,dep2.name payDepName,
            b.remarks,b.eaaid ,eap.name ,eap.bank ,eap.accounts ,b.status,b.process_status,
            c.id sonId,c.total_amount sonTotalAmount,c.settlement_amount sonSettlementAmount,c.amount sonAmount, c.`type` sonType,c.type_other sonTypeOther,
@@ -716,12 +752,14 @@
            c.debit_id debitId, debit.real_amount DebitRealAmount ,debit.settlement_amount DebitSettlementAmount,debit.liquidation_status DebitliquidationStatus,
            d.id detId,d.`type` detType,d.amount detAmount,d.real_amount detRealAmount ,d.start_district ,d.end_district,d.vehicle,d.vehicle_other,
            d.pay_type ,d.invoice_type ,d.invoice_no,d.payer_name ,d.open_bank ,d.bank_accounts ,d.open_bank_address,d.type_other detTypeOther,
-           date_format(d.start_time,'%Y-%m-%d %H:%i:%S')startTime,date_format(d.end_time,'%Y-%m-%d %H:%i:%S')endTime,
+           tm.buyer_name,o.buyer_id,
+             date_format(d.start_time,'%Y-%m-%d %H:%i:%S')startTime,date_format(d.end_time,'%Y-%m-%d %H:%i:%S')endTime,
            date_format(d.agree_time,'%Y-%m-%d')agreeTime
     from expense_relationship a left join expense_account b on a.id =b.id left join expense_account c on a.ea_id =c.id
     left join department dep on b.apply_dep =dep.id left join department dep2 on b.pay_dep =dep2.id
      left join expense_account_private eap on b.eaaid =eap.id left join expense_account_details d on c.id =d.eaid
-    left join t_order_new o on c.order_no =o.order_no left join public_release pr on c.prid=pr.id left join t_order_new pro on pr.order_no=pro.order_no
+    left join t_order_new o on c.order_no =o.order_no left join t_order_mid tm on c.order_no=tm.order_no
+    left join public_release pr on c.prid=pr.id left join t_order_new pro on pr.order_no=pro.order_no
     left join expense_account debit on c.debit_id=debit.id
     where a.id= #{id}
   </select>
@@ -755,6 +793,7 @@
     <result column="status" jdbcType="INTEGER" property="status" />
     <result column="process_status" jdbcType="INTEGER" property="processStatus" />
     <result column="createTimeStr" jdbcType="VARCHAR" property="createTimeStr" />
+    <result column="create_Time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="examine_name" jdbcType="VARCHAR" property="examineName" />
     <association property="sonList" resultMap="SonExpenseAccountMap"/>
   </resultMap>
@@ -783,6 +822,8 @@
     <result column="debitLiquidationStatus" jdbcType="INTEGER" property="debitLiquidationStatus" />
     <result column="order_no" jdbcType="VARCHAR" property="orderNo" />
     <result column="contract_no" jdbcType="VARCHAR" property="contractNo" />
+    <result column="buyer_name" jdbcType="VARCHAR" property="buyerName" />
+    <result column="buyer_id" jdbcType="VARCHAR" property="buyerId" />
     <result column="publicReleaseType" jdbcType="INTEGER" property="publicReleaseType" />
     <association property="detList" resultMap="ExpenseAccountDetailsMap"/>
   </resultMap>
@@ -949,6 +990,7 @@
     ${page_sql}
   </select>
   <sql id="ExpenseDetailsSql">
+    and a.status in (0,1,2,3)
     <if test=" status != null">
       and mea.status = #{status}
     </if>
@@ -961,12 +1003,19 @@
         #{dep}
       </foreach>
     </if>
+    <if test="myType ==1">
+      and a.aid = #{current}
+    </if>
     <if test="roleType ==1">
+    <if test="myType ==0">
       and dep.expense_finance_id = #{current}
     </if>
+    </if>
     <if test="roleType ==2">
+    <if test="myType ==0">
       and (dep.expense_finance_id in  (select id from admin where superior_id = #{current}) or dep.expense_finance_id = #{current})
     </if>
+    </if>
     <if test=" contractNo != null">
       and o.contract_no like concat('%',#{contractNo},'%')
     </if><if test=" buyerName != null">
@@ -989,10 +1038,10 @@
     select count(*)
     from expense_account_details  ead left join expense_account a on ead.eaid =a.id
     left join expense_relationship er on a.id=er.ea_id  left join expense_account mea on  er.id=mea.id
-    left join t_order_new o on mea.order_no =o.order_no left join t_order_mid tm on o.order_no =tm.order_no
+    left join t_order_new o on a.order_no =o.order_no left join t_order_mid tm on o.order_no =tm.order_no
     left join department dep on mea.apply_dep =dep.id
-    left join department dep2 on mea.pay_dep =dep2.id  left join  admin ad on mea.aid=ad.id
-    left join department dep3 on ad.department_id =dep3.id left join admin ad2 on dep3.finance_id =ad2.id
+    left join department dep2 on mea.pay_dep =dep2.id  left join  admin ad on a.aid=ad.id
+    left join department dep3 on ad.department_id =dep3.id left join admin ad2 on dep.expense_finance_id =ad2.id
     where 1=1
     <include refid="ExpenseDetailsSql"/>
   </select>
@@ -1000,10 +1049,10 @@
     select sum(ead.amount) totalAmount
     from expense_account_details  ead left join expense_account a on ead.eaid =a.id
     left join expense_relationship er on a.id=er.ea_id  left join expense_account mea on  er.id=mea.id
-    left join t_order_new o on mea.order_no =o.order_no left join t_order_mid tm on o.order_no =tm.order_no
+    left join t_order_new o on a.order_no =o.order_no left join t_order_mid tm on o.order_no =tm.order_no
     left join department dep on mea.apply_dep =dep.id
-    left join department dep2 on mea.pay_dep =dep2.id  left join  admin ad on mea.aid=ad.id
-    left join department dep3 on ad.department_id =dep3.id left join admin ad2 on dep3.finance_id =ad2.id
+    left join department dep2 on mea.pay_dep =dep2.id  left join  admin ad on a.aid=ad.id
+    left join department dep3 on ad.department_id =dep3.id left join admin ad2 on dep.expense_finance_id =ad2.id
     where 1=1
     <include refid="ExpenseDetailsSql"/>
   </select>
@@ -1061,4 +1110,9 @@
     set a.type_other = #{types}
     where a.id in (select id from expense_relationship where ea_id = #{id} )
   </update>
+    <update id="updateRemoveOrderNo">
+      update expense_account a
+      set a.order_no = null
+      where a.id = #{id}
+    </update>
 </mapper>

+ 1 - 1
src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml

@@ -731,7 +731,7 @@
     date_format(b.release_start,'%Y-%m-%d %H:%i:%S') releaseStarts,date_format(b.release_end ,'%Y-%m-%d %H:%i:%S') releaseEnds,
     b.plan ,b.next_plan nextPlan ,b.expected_effect expectedEffect,b.update_status updateStatus,b.assist_aid_name assistAidName,
     b.main_name mainName,b.assist,b.assistant_aid assistantAid, b.assistant_name assistantName,f.contract_no contractNo,
-    e.name sname,f.total_amount  totalAmout
+    e.name sname,f.total_amount  totalAmout,d.sign_bills signBills,date_format(d.sign_time,'%Y-%m-%d')signTime
     from public_release_details a left join public_release b on a.prid =b.id
     left join admin c on b.aid =c.id left join t_order_new f on b.order_no =f.order_no
     left join `user` d on a.uid =d.id  left join admin e on d.aid=e.id

+ 1 - 1
src/main/java/com/goafanti/common/mapper/TOrderMidMapper.xml

@@ -465,7 +465,7 @@
     where b.id=#{transferId} and a.salesman_id=#{aid}
   </update>
   <update id="updateFinanceId">
-    update t_order_new a ,t_order_mid b,admin c  set b.finance_id=#{financeId},b.finance_name=c.name
+    update t_order_new a ,t_order_mid b,admin c  set b.finance_id=c.id,b.finance_name=c.name
     where a.order_dep=#{id} and a.order_no=b.order_no and c.id= #{financeId}
   </update>
   <update id="updatefinalReceivables">

+ 124 - 1
src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml

@@ -2116,7 +2116,7 @@ left join department d on o.order_dep = d.id   left join t_order_mid a on o.orde
     where a.order_no = #{orderNo}
   </select>
   <select id="selectByuidandAid" resultType="com.goafanti.order.bo.TOrderNewBo">
-    select order_no orderNo
+    select order_no orderNo,sign_time signTime
     from t_order_new
     where buyer_id=#{uid} and salesman_id=#{aid}
   </select>
@@ -2161,6 +2161,20 @@ left join department d on o.order_dep = d.id   left join t_order_mid a on o.orde
        #{e}
     </foreach>
   </update>
+  <update id="updateOrderDepFinanceExamineName">
+    update t_order_new x ,(select order_no ,group_concat(aname)name
+    from t_order_examine where order_no in
+    <foreach collection="list" item="e" close=")" open="(" separator=",">
+      #{e}
+    </foreach>
+    and status =0 group by order_no) y
+    set x.examine_name =y.name
+    where x.order_no in
+    <foreach collection="list" item="e" close=")" open="(" separator=",">
+      #{e}
+    </foreach>
+    and x.order_no =y.order_no
+  </update>
 
   <select id="selectAidAndDate" resultType="java.lang.Integer">
     select count(*)
@@ -2190,5 +2204,114 @@ left join department d on o.order_dep = d.id   left join t_order_mid a on o.orde
     from department a left join t_order_new b on a.id =b.order_dep
     where b.order_no= #{orderNo}
   </select>
+  <select id="selectByFinanceNotExamine" resultType="string">
+    select a.order_no orderNo,a.process_status processStatus
+    from t_order_new a left join t_order_examine b on a.order_no=b.order_no
+    where b.status=0 and b.aid = #{financeId} and a.process_status = 3
+  </select>
+    <select id="selectExpenseCount" parameterType="com.goafanti.expenseAccount.bo.ExpenseCountsInput" resultType="com.goafanti.expenseAccount.bo.ExpenseCountsBo">
+      select a.order_no orderNo,a.contract_no contractNo,b.buyer_name buyerName,a.total_amount totalAmount,a.settlement_amount settlementAmount,
+             c.expenseCount,c.peopleCount,c.notExamine,c.rejectCount,d.paymentAmount,c.days,c.amount expenseAmount
+      from t_order_new a left join t_order_mid b on a.order_no =b.order_no
+      left join (select a.order_no,a.expenseCount,b.peopleCount,c.notExamine, c.rejectCount,a.days,a.amount
+                from (select a.order_no,count(a.id)expenseCount,sum(a.amount) amount,sum(ROUND(a.duration/7.5) )days
+                      from expense_account a where a.order_no in (select a.order_no from expense_account a
+                      where a.target_type = 1 group by order_no)
+                      and a.status=2
+                <if test="startTime !=null and endTime != null">
+                  and a.create_time BETWEEN #{startTime} and #{endTime}
+                </if>
+                group by order_no )a
+                left join (select order_no,count(aid)peopleCount from (select a.order_no,aid from expense_account a where a.order_no in
+                (select a.order_no from expense_account a  where a.target_type = 1
+                and a.status=2
+                group by order_no)
+                <if test="startTime !=null and endTime != null">
+                and a.create_time BETWEEN #{startTime} and #{endTime}
+                </if>
+                group by order_no,aid )a group by order_no)b on a.order_no=b.order_no
+                left join (select a.order_no,sum(notExamine)notExamine,sum(rejectCount)rejectCount
+                from (select a.order_no,status ,IF(status=1,1,0)notExamine,IF(status=3,1,0)rejectCount
+                from expense_account a where a.order_no in (select a.order_no from expense_account a where a.target_type = 1
+                group by order_no)
+                <if test="startTime !=null and endTime != null">
+                  and a.create_time BETWEEN #{startTime} and #{endTime}
+                </if>
+                )a group by order_no)c on a.order_no=c.order_no )c on a.order_no =c.order_no
+      left join (    select a.order_no ,sum(c.payment_amount) paymentAmount
+      from t_order_new a left join t_order_task b on a.order_no =b.order_no left join  t_order_payment c on b.id =c.tid
+      where c.status =3 and a.order_no in (select a.order_no from expense_account a  where a.target_type = 1
+      group by order_no)
+      <if test="startTime !=null and endTime != null">
+        and a.create_time BETWEEN #{startTime} and #{endTime}
+      </if>
+      group by order_no )d on a.order_no=d.order_no
+      where a.order_no in (select a.order_no from expense_account a where a.target_type = 1
+                <if test="startTime !=null and endTime != null">
+                  and a.create_time BETWEEN #{startTime} and #{endTime}
+                </if>
+                group by order_no)
+      <if test="contactNo !=null ">
+        and  a.contract_no like concat('%' ,#{contactNo},'%')
+      </if>
+      <if test="buyerName !=null ">
+        and  b.buyer_name like concat('%' ,#{buyerName},'%')
+      </if>
+      <if test="depId !=null ">
+        and a.order_dep = #{depId}
+      </if>
+    </select>
+  <select id="selectExpenseDepCount" resultType="com.goafanti.expenseAccount.bo.ExpenseCountsBo">
+    select a.id depId,a.name depName,ifnull(b.totalAmount,0) totalAmount,ifnull(b.settlementAmount,0) settlementAmount,
+           c.amount ExpenseAmount,ifnull(f.paymentAmount,0) paymentAmount,d.peopleCount,c.days,c.expenseCount, e.notExamine,
+           e.rejectCount
+    from department a
+    left join (select a.order_dep ,sum(a.total_amount)totalAmount,sum(a.settlement_amount)settlementAmount
+            from t_order_new a where a.order_dep in (select a.apply_dep
+            from expense_account a where a.target_type = 0 group by apply_dep)
+            <if test="startTime !=null and endTime != null">
+              and a.create_time BETWEEN #{startTime} and #{endTime}
+            </if>
+            group by a.order_dep )b on a.id=b.order_dep
+    left join (select a.apply_dep,count(a.id)expenseCount, sum(ROUND(a.duration/7.5) )days ,sum(a.amount)amount
+           from expense_account a where a.apply_dep in (select a.apply_dep from expense_account a where a.target_type = 0 group by apply_dep)
+            and a.status=2
+          <if test="startTime !=null and endTime != null">
+            and a.create_time BETWEEN #{startTime} and #{endTime}
+          </if>
+            group by apply_dep )c on a.id=c.apply_dep
+    left join (select apply_dep,count(aid)peopleCount from (select a.apply_dep,aid from expense_account a where a.apply_dep in
+          (select a.apply_dep
+          from expense_account a where a.target_type = 0 group by apply_dep)
+            and a.status=2
+          <if test="startTime !=null and endTime != null">
+            and a.create_time BETWEEN #{startTime} and #{endTime}
+          </if>
+        group by apply_dep,aid )a group by apply_dep)d on a.id=d.apply_dep
+    left join (select a.apply_dep,sum(notExamine)notExamine,sum(rejectCount)rejectCount
+             from (select a.apply_dep,status ,IF(status=1,1,0)notExamine,IF(status=3,1,0)rejectCount
+               from expense_account a where a.apply_dep in (select a.apply_dep from expense_account a where a.target_type = 0 group by apply_dep)
+          <if test="startTime !=null and endTime != null">
+            and a.create_time BETWEEN #{startTime} and #{endTime}
+          </if>
+            )a group by apply_dep)e on a.id=e.apply_dep
+    left join (select a.order_dep ,sum(c.payment_amount) paymentAmount from t_order_new a
+            left join t_order_task b on a.order_no =b.order_no left join  t_order_payment c on b.id =c.tid
+            where c.status =3 and a.order_dep in (select a.apply_dep from expense_account a where a.target_type = 0 group by apply_dep)
+            <if test="startTime !=null and endTime != null">
+              and a.create_time BETWEEN #{startTime} and #{endTime}
+            </if>
+            group by order_dep )f on a.id=f.order_dep
+    where a.id in (select a.apply_dep
+                   from expense_account a where a.target_type = 0
+                  <if test="startTime !=null and endTime != null">
+                    and a.create_time BETWEEN #{startTime} and #{endTime}
+                  </if>
+                   group by apply_dep)
+    <if test="depId !=null ">
+      and a.id = #{depId}
+    </if>
+
+  </select>
 
 </mapper>

+ 2 - 2
src/main/java/com/goafanti/common/mapper/UserLockReleaseMapper.xml

@@ -524,8 +524,8 @@
 
   <update id="updateByAidAndUid">
   	update user_lock_release
-	set status =2,release_time =now()
-	where aid= #{aid} and uid= #{uid} and `type` =0
+	set status =2,release_time =now(),type=0
+	where   uid= #{uid} and `type` =0
   </update>
   <select id="selectByids" resultType="java.lang.String">
   select uid from user_lock_release

File diff suppressed because it is too large
+ 1481 - 1619
src/main/java/com/goafanti/common/mapper/UserMapper.xml


+ 3 - 1
src/main/java/com/goafanti/common/mapper/UserMapperExt.xml

@@ -2310,7 +2310,9 @@ inner join(
 	<select id="selectNoChannelByaids" resultType="com.goafanti.admin.bo.AdminCustomerBo">
 		select aid,sum(if( share_type=0 and channel=0,1,0))userCount,
 		sum(if(share_type=3 and channel=1,1,0))channelCount, sum(if( share_type=2 ,1,0))signCount,
-		sum(if(share_type=0 and source =1 and channel=0,1,0))newCount, sum(if(share_type=0 and source =1 and channel=1,1,0))channelNewCount,
+		sum(if(share_type=0 and source =1 and channel=0,1,0))newCount,
+		sum(if(share_type=0 and source =3 and channel=0,1,0))transferCount,
+		sum(if(share_type=0 and source =1 and channel=1,1,0))channelNewCount,
 		sum(if(share_type=0 and source =2 and channel=0,1,0))receiveCount from `user` where `type` =1 and new_channel=0
 		<if test="startTime != null and endTime != null">
 			and  transfer_time  between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}

+ 3 - 2
src/main/java/com/goafanti/common/mapper/UserNamesMapper.xml

@@ -140,8 +140,9 @@
 	where a.uid = #{uid}
 	order by a.create_time 
   </select>
-  <select id="checkUserName" resultType="java.lang.Integer">
-  select count(*) from user_names where name= #{userName}
+  <select id="checkUserName" resultType="com.goafanti.customer.bo.UserNamesListBo">
+    select id,uid,aid,name ,date_format(create_time,'%Y-%m-%d %H:%i:%S') createTimes
+    from user_names where name= #{userName}
   </select>
   
   <insert id="insertBatch" parameterType="com.goafanti.user.bo.InputUserChannel">

+ 10 - 123
src/main/java/com/goafanti/common/model/User.java

@@ -3,212 +3,93 @@ package com.goafanti.common.model;
 import java.util.Date;
 
 /**
- * user
- * @author
+ * @TableName user
  */
 public class User implements AftUser{
     private String id;
 
-    /**
-     * 手机号
-     */
     private String mobile;
 
-    /**
-     * 密码,md5+salt
-     */
     private String password;
 
-    /**
-     * 用户昵称
-     */
     private String nickname;
 
-    /**
-     * 用户邮箱
-     */
     private String email;
 
-    /**
-     * 注册时间
-     */
     private Date createTime;
 
-    /**
-     * 用户编号
-     */
     private Long number;
 
-    /**
-     * 会员等级
-     */
     private Integer lvl;
 
-    /**
-     * 个人/单位,默认0-个人账号,1-组织账号
-     */
     private Integer type;
 
-    /**
-     * 管理员ID
-     */
     private String aid;
 
-    /**
-     * 客户经理ID
-     */
     private String mid;
 
-    /**
-     * 账户状态 0-有效 1-失效 2-锁定
-     */
     private Integer status;
 
-    /**
-     * 用户来源 0 注册 1 录入 2 领取 3 转交
-     */
     private Integer source;
 
-    /**
-     * 更新时间
-     */
     private Date updateTime;
 
-    /**
-     * 公司LOGO
-     */
     private String companyLogoUrl;
 
-    /**
-     * 个人头像
-     */
     private String headPortraitUrl;
 
-    /**
-     * 社会属性标签
-     */
     private String societyTag;
 
-    /**
-     * 简介
-     */
     private String introduction;
 
-    /**
-     * 增值属性标签
-     */
     private String valueAddedTag;
 
-    /**
-     * 所属单位用户ID
-     */
     private String organizationId;
 
-    /**
-     * 共享类型 0=私有 1=公共 2=签单 3=外联 4=渠道
-     */
     private Integer shareType;
 
-    /**
-     * 客户认证名称
-     */
     private String identifyName;
 
-    /**
-     * 专家详情背景图
-     */
     private String backgroundUrl;
 
-    /**
-     * 客户审核状态 0-待审核 ,1-审核通过,2-审核拒绝
-     */
     private Integer auditStatus;
 
-    /**
-     * 审核意见
-     */
     private String auditOpinion;
 
-    /**
-     * 客户转换时间
-     */
     private Date transferTime;
 
-    /**
-     * 资料维护人
-     */
     private String informationMaintainer;
 
-    /**
-     * 核心技术
-     */
     private String coreTechnology;
 
-    /**
-     * 客户已完成项目情况
-     */
     private String accomplishSituation;
 
-    /**
-     * 已有知识产权情况
-     */
     private String intellectualProperty;
 
-    /**
-     * 信用等级 1 A级优质,2 B级正常,3 C级失信
-     */
     private Integer creditRating;
 
-    /**
-     * 用户等级 0 一般客户 1 意向客户 2 重点客户
-     */
     private Integer level;
 
-    /**
-     * 0-未认证,1-已认证
-     */
     private Integer authentication;
 
-    /**
-     * 用户注册名
-     */
     private String username;
 
-    /**
-     * 完整度
-     */
     private Double integrity;
 
-    /**
-     * 邀请码
-     */
     private String toInviteCode;
 
-    /**
-     * 受邀请码
-     */
     private String beInviteCode;
 
-    /**
-     * 指导 0无 1有
-     */
     private Integer guidance;
 
-    /**
-     * 签单标记 0未签单 1已签单
-     */
     private Integer signBills;
 
-    /**
-     * 外联客户 0否 1是
-     */
     private Integer channel;
 
-    /**
-     * 渠道客户 0否 1是
-     */
     private Integer newChannel;
 
+    private Date signTime;
+
     private static final long serialVersionUID = 1L;
 
     public String getId() {
@@ -539,5 +420,11 @@ public class User implements AftUser{
         this.newChannel = newChannel;
     }
 
+    public Date getSignTime() {
+        return signTime;
+    }
 
-}
+    public void setSignTime(Date signTime) {
+        this.signTime = signTime;
+    }
+}

+ 13 - 16
src/main/java/com/goafanti/common/utils/AsyncUtils.java

@@ -711,26 +711,23 @@ public class AsyncUtils {
 		newOrderChangeMapper.updateExamineById(id,OrderChangeProcess.CWZY.getCode());
 	}
 
-	public  void updateFinanceExamineAndDep(String id, String financeId, String depFinanceId){
-		updateFinanceExamine( id);
-		tOrderMidMapper.updateFinanceId(id,financeId);
-		//如果切换财务,俩个财务都需要重新计算
-		financeCoutSwitch(financeId,depFinanceId);
-	}
 
-	public void financeCoutSwitch(String financeId, String depFinanceId) {
-		List<FinanceCount> list=new ArrayList<>();
-		financeCountRestart(financeId,list);
-		financeCountRestart(depFinanceId,list);
-		financeCountMapper.deleteByAid(financeId);
-		financeCountMapper.deleteByAid(depFinanceId);
-		listBatches(list);
+
+
+
+	public void financeCoutSwitch(List<String> aids) {
+		for (String aid : aids) {
+			List<FinanceCount> list=new ArrayList<>();
+			financeCountRestart(aid,list);
+			financeCountMapper.deleteByAid(aid);
+			listBatches(list);
+		}
 	}
 
-	public void financeCoutSwitch(String financeId) {
+	public void financeCoutSwitch(String aid) {
 		List<FinanceCount> list=new ArrayList<>();
-		financeCountRestart(financeId,list);
-		financeCountMapper.deleteByAid(financeId);
+		financeCountRestart(aid,list);
+		financeCountMapper.deleteByAid(aid);
 		listBatches(list);
 	}
 

+ 5 - 19
src/main/java/com/goafanti/common/utils/RedisUtil.java

@@ -1,30 +1,16 @@
 package com.goafanti.common.utils;
 
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.goafanti.common.model.Admin;
-import com.goafanti.common.model.AftUser;
-import com.goafanti.core.shiro.token.ShiroToken;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.session.mgt.SimpleSession;
-import org.apache.shiro.subject.Subject;
+import com.alibaba.fastjson.JSON;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
-
-import com.alibaba.fastjson.JSON;
-
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
+
+import java.io.*;
+import java.util.List;
+import java.util.Set;
 /**
  * redis辅助类
  * @author

+ 60 - 6
src/main/java/com/goafanti/common/utils/pdf/PDFUtils.java

@@ -1,24 +1,25 @@
 package com.goafanti.common.utils.pdf;
 
 import com.goafanti.RD.bo.OutWordRdDetails;
+import com.goafanti.common.constant.AFTConstants;
+import com.goafanti.common.utils.DateUtils;
 import com.goafanti.common.utils.excel.FileUtils;
+import com.goafanti.expenseAccount.bo.MainExpenseAccount;
 import com.itextpdf.text.*;
-import com.itextpdf.text.Font;
 import com.itextpdf.text.pdf.BaseFont;
 import com.itextpdf.text.pdf.PdfWriter;
-import org.apache.pdfbox.pdmodel.PDDocument;
 import org.springframework.http.MediaType;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.awt.*;
-import java.io.*;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.Date;
 
 public class PDFUtils {
 
 
-    public  void pushPDF(OutWordRdDetails data, HttpServletResponse response,String uploadPath) {
+    public  void pushRd(OutWordRdDetails data, HttpServletResponse response,String uploadPath) {
         String attName = data.getRdName()+new Date().getTime() + ".pdf";
         String realFileName = uploadPath+"/tmp/"+new Date().getTime() + ".pdf";
         response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
@@ -89,6 +90,11 @@ public class PDFUtils {
         return font;
     }
 
+    public static Font getFont(int size){
+        Font font =setFont(size,Font.NORMAL);
+        return font;
+    }
+
 
     /**
      *
@@ -109,4 +115,52 @@ public class PDFUtils {
 
         return font;
     }
+
+
+
+
+    private static String   CHECKNO="报销编号:";
+    private static String   APPLYDEP="申请部门:";
+    private static String   ANAME="报销人:";
+    private static String   CREATETIME="报销日期:";
+    private static String   REMARKS="报销事由:";
+    private static String   BANK_ACCOUNT="收款方式:";
+    private static String   BLANK="      ";
+    public static void pushExpenseTitle(Document document, MainExpenseAccount mainExpenseAccount) throws DocumentException {
+
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(CHECKNO).append(mainExpenseAccount.getCheckNo()).append(BLANK)
+                    .append(APPLYDEP).append(mainExpenseAccount.getApplyDepName()).append(BLANK).append(BLANK).append(BLANK)
+                    .append(ANAME).append(mainExpenseAccount.getAname());
+        Paragraph tile1=new Paragraph(builder.toString(),getFont(8));
+        document.add(tile1);
+        String creactTime= DateUtils.formatDate(mainExpenseAccount.getCreateTime(), AFTConstants.YYYYMMDD);
+        int x2 = CREATETIME.length() + creactTime.length()/2 +
+                REMARKS.length() + mainExpenseAccount.getRemarks().length() +
+                BANK_ACCOUNT.length() + mainExpenseAccount.getBank().length() +
+                mainExpenseAccount.getAccounts().length()/2 + mainExpenseAccount.getName().length();
+        builder.setLength(0);
+        if (x2>55){
+            builder.append(CREATETIME).append(creactTime).append(BLANK)
+                    .append(REMARKS).append(mainExpenseAccount.getRemarks()).append(BLANK)
+                    .append(BANK_ACCOUNT).append(mainExpenseAccount.getBank()).append(BLANK)
+                    .append(mainExpenseAccount.getAccounts()).append(BLANK)
+                    .append(mainExpenseAccount.getName());
+        }else {
+            int y =(60-x2)*2;
+            StringBuilder blank= new StringBuilder();
+            for (int i = 0; i < y; i++) {
+                blank.append(" ");
+            }
+            builder.append(CREATETIME).append(creactTime).append(blank)
+                    .append(REMARKS).append(mainExpenseAccount.getRemarks()).append(blank)
+                    .append(BANK_ACCOUNT).append(mainExpenseAccount.getBank()).append(BLANK)
+                    .append(mainExpenseAccount.getAccounts()).append(BLANK)
+                    .append(mainExpenseAccount.getName());
+        }
+        Paragraph tile2=new Paragraph(builder.toString(),getFont(8));
+        document.add(tile2);
+    }
+
 }

+ 1 - 0
src/main/java/com/goafanti/core/cache/serializer/FastJsonRedisSerializer.java

@@ -31,6 +31,7 @@ public class FastJsonRedisSerializer implements RedisSerializer<Object> {
 		pc.addAccept("java.util.Map");
 		pc.addAccept("com.goafanti.common.bo.OutPoverty");
 		pc.addAccept("com.goafanti.common.bo.OutPovertyFlag");
+		pc.addAccept("com.goafanti.expenseAccount.bo.ExpenseCountsBo");
 
 	}
 

+ 4 - 9
src/main/java/com/goafanti/customer/controller/AdminCustomerApiController.java

@@ -354,7 +354,7 @@ public class AdminCustomerApiController extends BaseApiController{
 					ParamUtils.getParamName(in,bindingResult.getFieldError().getField())));
 			return res;
 		}
-		if (customerService.checkUserName(in.getName())){
+		if (customerService.checkUserName(null,in.getName())){
 			res.getError().add(buildError("客户名称已存在"));
 			return res;
 		}
@@ -1383,12 +1383,7 @@ public class AdminCustomerApiController extends BaseApiController{
 	}
 	/**
 	 * 查看客户日期内新增客户
-	 * @param startTime
-	 * @param endTime
-	 * @param type 0私有 1渠道 2签单 3私有新增 4渠道新增 5私有面谈 6渠道面谈 7私有领取
-	 * @param pageSize
-	 * @param pageNo
-	 * @return
+	 * @param type 0私有 1渠道 2签单 3私有新增 4渠道新增 5私有面谈 6渠道面谈 7私有领取 8 私有转交
 	 */
 	@RequestMapping(value = "/selectAdminCustomerList", method = RequestMethod.GET)
 	public Result selectAdminCustomerList(String aid, String startTime,String endTime,Integer type, Integer pageSize, Integer pageNo) {
@@ -1480,7 +1475,7 @@ public class AdminCustomerApiController extends BaseApiController{
 		if (userName!=null){
 			userName=userName.trim();
 		}
-		if(customerService.checkUserName(userName)){
+		if(customerService.checkUserName(uid,userName)){
 			res.getError().add(buildError(ErrorConstants.CUSTOMER_ALREADY_EXIST,null,"["+userName+"]"));
 			return res;
 		}
@@ -1490,7 +1485,7 @@ public class AdminCustomerApiController extends BaseApiController{
 	@RequestMapping(value = "/checkUserName",method = RequestMethod.GET)
 	public Result checkUserName(String userName){
 		Result res =new Result();
-		res.data(customerService.checkUserName(userName));
+		res.data(customerService.checkUserName(null,userName));
 		return res;
 	}
 

+ 1 - 1
src/main/java/com/goafanti/customer/service/CustomerService.java

@@ -526,7 +526,7 @@ public interface CustomerService {
 	Object listChannelCounts(InputChannelCounts in);
 	int updateUserName(String uid, String userName);
 	List<UserNamesListBo> listUserName(String uid);
-	boolean checkUserName(String userName);
+	boolean checkUserName(String uid,String userName);
 	Object getUserByNames(String name,Integer type, Integer pageNo, Integer pageSize);
 
 	Pagination<OutUserMianProducts> mainProductsList(InputMainProductsList in) ;

+ 15 - 8
src/main/java/com/goafanti/customer/service/impl/CustomerServiceImpl.java

@@ -2753,21 +2753,28 @@ public class CustomerServiceImpl extends BaseMybatisDao<UserMapper> implements C
 	}
 
 	@Override
-	public boolean checkUserName(String userName) {
+	public boolean checkUserName(String uid,String userName) {
 		String name2=null;
 		if (userName.contains("(")){
 			name2=userName.replace("(","(").replace(")",")");
 		}else if (userName.contains("(")){
 			name2=userName.replace("(","(").replace(")",")");
 		}
-		int i=userNamesMapper.checkUserName(userName);
-		i+=userNamesMapper.checkUserName(name2);
-
-		if (i>0) {
-			return true;
+		List<UserNamesListBo> list=userNamesMapper.checkUserName(userName);
+		List<UserNamesListBo> list2=userNamesMapper.checkUserName(name2);
+		int i=0;
+		for (UserNamesListBo userNamesListBo : list) {
+			if (!userNamesListBo.getUid().equals(uid)){
+				i++;
+			}
 		}
-		return false;
-	}
+		for (UserNamesListBo userNamesListBo : list2) {
+			if (!userNamesListBo.getUid().equals(uid)){
+				i++;
+			}
+		}
+        return i > 0;
+    }
 
 	@Override
 	public List<UserNamesListBo> listUserName(String uid) {

+ 145 - 0
src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsBo.java

@@ -0,0 +1,145 @@
+package com.goafanti.expenseAccount.bo;
+
+import java.math.BigDecimal;
+
+public class ExpenseCountsBo {
+
+    private String orderNo;
+    private String contractNo;
+    private String buyerName;
+
+    private String depId;
+
+    private String depName;
+    private BigDecimal totalAmount;
+    private BigDecimal settlementAmount;
+    private BigDecimal expenseAmount;
+    private Integer expenseCount;
+    private Integer peopleCount;
+    private Integer rejectCount;
+    private BigDecimal paymentAmount;
+
+    private Integer notExamine;
+    private Integer days;
+
+    public String getDepId() {
+        return depId;
+    }
+
+    public void setDepId(String depId) {
+        this.depId = depId;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public BigDecimal getExpenseAmount() {
+        if(expenseAmount == null){
+            expenseAmount = BigDecimal.ZERO;
+        }
+        return expenseAmount;
+    }
+
+    public void setExpenseAmount(BigDecimal expenseAmount) {
+        this.expenseAmount = expenseAmount;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public BigDecimal getSettlementAmount() {
+        return settlementAmount;
+    }
+
+    public void setSettlementAmount(BigDecimal settlementAmount) {
+        this.settlementAmount = settlementAmount;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getContractNo() {
+        return contractNo;
+    }
+
+    public void setContractNo(String contractNo) {
+        this.contractNo = contractNo;
+    }
+
+    public String getBuyerName() {
+        return buyerName;
+    }
+
+    public void setBuyerName(String buyerName) {
+        this.buyerName = buyerName;
+    }
+
+    public Integer getExpenseCount() {
+        if (expenseCount==null)return 0;
+        return expenseCount;
+    }
+
+    public void setExpenseCount(Integer expenseCount) {
+        this.expenseCount = expenseCount;
+    }
+
+    public Integer getPeopleCount() {
+        if (peopleCount==null)return 0;
+        return peopleCount;
+    }
+
+    public void setPeopleCount(Integer peopleCount) {
+        this.peopleCount = peopleCount;
+    }
+
+    public Integer getRejectCount() {
+        if (rejectCount==null)return 0;
+        return rejectCount;
+    }
+
+    public void setRejectCount(Integer rejectCount) {
+        this.rejectCount = rejectCount;
+    }
+
+    public BigDecimal getPaymentAmount() {
+        if (paymentAmount==null)return BigDecimal.ZERO;
+        return paymentAmount;
+    }
+
+    public void setPaymentAmount(BigDecimal paymentAmount) {
+        this.paymentAmount = paymentAmount;
+    }
+
+    public Integer getNotExamine() {
+        if (notExamine==null)return 0;
+        return notExamine;
+    }
+
+    public void setNotExamine(Integer notExamine) {
+        this.notExamine = notExamine;
+    }
+
+    public Integer getDays() {
+        if (days==null)return 0;
+        return days;
+    }
+
+    public void setDays(Integer days) {
+        this.days = days;
+    }
+}

+ 134 - 0
src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsDep.java

@@ -0,0 +1,134 @@
+package com.goafanti.expenseAccount.bo;
+
+import com.goafanti.common.utils.excel.Excel;
+
+import java.math.BigDecimal;
+
+public class ExpenseCountsDep extends ExpenseCountsBo{
+
+
+
+
+    @Excel(name = "部门名称",width = 24)
+    private String depName;
+
+    @Excel(name = "合同金额")
+    private BigDecimal totalAmount;
+    @Excel(name = "已收款")
+    private BigDecimal settlementAmount;
+    @Excel(name = "报销总额")
+    private BigDecimal expenseAmount;
+    @Excel(name = "已付成本")
+    private BigDecimal paymentAmount;
+
+    @Excel(name = "报销人数")
+    private Integer peopleCount;
+    @Excel(name = "天数")
+    private Integer days;
+    @Excel(name = "报销单数")
+    private Integer expenseCount;
+    @Excel(name = "报销未审核")
+    private Integer notExamine;
+    @Excel(name = "驳回单数")
+    private Integer rejectCount;
+
+    @Override
+    public String getDepName() {
+        return depName;
+    }
+
+    @Override
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    @Override
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    @Override
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    @Override
+    public BigDecimal getSettlementAmount() {
+        return settlementAmount;
+    }
+
+    @Override
+    public void setSettlementAmount(BigDecimal settlementAmount) {
+        this.settlementAmount = settlementAmount;
+    }
+
+    @Override
+    public BigDecimal getExpenseAmount() {
+        return expenseAmount;
+    }
+
+    @Override
+    public void setExpenseAmount(BigDecimal expenseAmount) {
+        this.expenseAmount = expenseAmount;
+    }
+
+    @Override
+    public BigDecimal getPaymentAmount() {
+        return paymentAmount;
+    }
+
+    @Override
+    public void setPaymentAmount(BigDecimal paymentAmount) {
+        this.paymentAmount = paymentAmount;
+    }
+
+    @Override
+    public Integer getPeopleCount() {
+        return peopleCount;
+    }
+
+    @Override
+    public void setPeopleCount(Integer peopleCount) {
+        this.peopleCount = peopleCount;
+    }
+
+    @Override
+    public Integer getDays() {
+        return days;
+    }
+
+    @Override
+    public void setDays(Integer days) {
+        this.days = days;
+    }
+
+    @Override
+    public Integer getExpenseCount() {
+        return expenseCount;
+    }
+
+    @Override
+    public void setExpenseCount(Integer expenseCount) {
+        this.expenseCount = expenseCount;
+    }
+
+    @Override
+    public Integer getNotExamine() {
+        return notExamine;
+    }
+
+    @Override
+    public void setNotExamine(Integer notExamine) {
+        this.notExamine = notExamine;
+    }
+
+    @Override
+    public Integer getRejectCount() {
+        return rejectCount;
+    }
+
+    @Override
+    public void setRejectCount(Integer rejectCount) {
+        this.rejectCount = rejectCount;
+    }
+}

+ 62 - 0
src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsInput.java

@@ -0,0 +1,62 @@
+package com.goafanti.expenseAccount.bo;
+
+public class ExpenseCountsInput {
+    private String startTime;
+    private String endTime;
+    private String depId;
+    private String contactNo;
+    private String buyerName;
+
+    /**
+     * 0:部门 1 订单
+     */
+    private Integer targetType;
+
+    public String getBuyerName() {
+        return buyerName;
+    }
+
+    public void setBuyerName(String buyerName) {
+        this.buyerName = buyerName;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getDepId() {
+        return depId;
+    }
+
+    public void setDepId(String depId) {
+        this.depId = depId;
+    }
+
+    public String getContactNo() {
+        return contactNo;
+    }
+
+    public void setContactNo(String contactNo) {
+        this.contactNo = contactNo;
+    }
+
+    public Integer getTargetType() {
+        return targetType;
+    }
+
+    public void setTargetType(Integer targetType) {
+        this.targetType = targetType;
+    }
+}

+ 155 - 0
src/main/java/com/goafanti/expenseAccount/bo/ExpenseCountsOrder.java

@@ -0,0 +1,155 @@
+package com.goafanti.expenseAccount.bo;
+
+import com.goafanti.common.utils.excel.Excel;
+
+import java.math.BigDecimal;
+
+public class ExpenseCountsOrder extends ExpenseCountsBo{
+
+
+    private String orderNo;
+    @Excel(name = "合同编号")
+    private String contractNo;
+    @Excel(name = "客户名称")
+    private String buyerName;
+
+    @Excel(name = "合同金额")
+    private BigDecimal totalAmount;
+    @Excel(name = "已收款")
+    private BigDecimal settlementAmount;
+    @Excel(name = "报销总额")
+    private BigDecimal expenseAmount;
+    @Excel(name = "已付成本")
+    private BigDecimal paymentAmount;
+
+    @Excel(name = "报销人数")
+    private Integer peopleCount;
+    @Excel(name = "天数")
+    private Integer days;
+    @Excel(name = "报销单数")
+    private Integer expenseCount;
+    @Excel(name = "报销未审核")
+    private Integer notExamine;
+    @Excel(name = "驳回单数")
+    private Integer rejectCount;
+
+    @Override
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    @Override
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    @Override
+    public String getContractNo() {
+        return contractNo;
+    }
+
+    @Override
+    public void setContractNo(String contractNo) {
+        this.contractNo = contractNo;
+    }
+
+    @Override
+    public String getBuyerName() {
+        return buyerName;
+    }
+
+    @Override
+    public void setBuyerName(String buyerName) {
+        this.buyerName = buyerName;
+    }
+
+    @Override
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    @Override
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    @Override
+    public BigDecimal getSettlementAmount() {
+        return settlementAmount;
+    }
+
+    @Override
+    public void setSettlementAmount(BigDecimal settlementAmount) {
+        this.settlementAmount = settlementAmount;
+    }
+
+    @Override
+    public BigDecimal getExpenseAmount() {
+        return expenseAmount;
+    }
+
+    @Override
+    public void setExpenseAmount(BigDecimal expenseAmount) {
+        this.expenseAmount = expenseAmount;
+    }
+
+    @Override
+    public BigDecimal getPaymentAmount() {
+        return paymentAmount;
+    }
+
+    @Override
+    public void setPaymentAmount(BigDecimal paymentAmount) {
+        this.paymentAmount = paymentAmount;
+    }
+
+    @Override
+    public Integer getPeopleCount() {
+        return peopleCount;
+    }
+
+    @Override
+    public void setPeopleCount(Integer peopleCount) {
+        this.peopleCount = peopleCount;
+    }
+
+    @Override
+    public Integer getDays() {
+        return days;
+    }
+
+    @Override
+    public void setDays(Integer days) {
+        this.days = days;
+    }
+
+    @Override
+    public Integer getExpenseCount() {
+        return expenseCount;
+    }
+
+    @Override
+    public void setExpenseCount(Integer expenseCount) {
+        this.expenseCount = expenseCount;
+    }
+
+    @Override
+    public Integer getNotExamine() {
+        return notExamine;
+    }
+
+    @Override
+    public void setNotExamine(Integer notExamine) {
+        this.notExamine = notExamine;
+    }
+
+    @Override
+    public Integer getRejectCount() {
+        return rejectCount;
+    }
+
+    @Override
+    public void setRejectCount(Integer rejectCount) {
+        this.rejectCount = rejectCount;
+    }
+}

+ 12 - 0
src/main/java/com/goafanti/expenseAccount/bo/InputDetailsListBo.java

@@ -4,6 +4,10 @@ public class InputDetailsListBo {
     private Integer pageSize;
     private Integer pageNo;
     /**
+     * 0 明细查看表 1我的明细表
+     */
+    private Integer myType;
+    /**
      * 状态 0=草稿,1=审核中,2=完成,3=驳回 ,4=撤销
      */
     private Integer status;
@@ -49,6 +53,14 @@ public class InputDetailsListBo {
      */
     private String checkNo;
 
+    public Integer getMyType() {
+        return myType;
+    }
+
+    public void setMyType(Integer myType) {
+        this.myType = myType;
+    }
+
     public Integer getPageSize() {
         return pageSize;
     }

+ 12 - 0
src/main/java/com/goafanti/expenseAccount/bo/InputPageListBo.java

@@ -48,10 +48,22 @@ public class InputPageListBo {
     private String checkNo;
     private Integer expenseMain;
     private Integer secondaryType;
+    /**
+     * 0查看审核  1查看自己
+     */
+    private Integer roleType;
 
     private Integer pageNo;
     private Integer pageSize;
 
+    public Integer getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(Integer roleType) {
+        this.roleType = roleType;
+    }
+
     public Integer getSecondaryType() {
         return secondaryType;
     }

+ 14 - 0
src/main/java/com/goafanti/expenseAccount/bo/MainExpenseAccount.java

@@ -1,6 +1,9 @@
 package com.goafanti.expenseAccount.bo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 public class MainExpenseAccount  {
@@ -28,6 +31,7 @@ public class MainExpenseAccount  {
     private String bank;
     private String accounts;
     private String createTimeStr;
+    private Date createTime;
     private String examineName;
     /**
      * 0=非审核,1=当前审核,2=我的订单
@@ -37,6 +41,16 @@ public class MainExpenseAccount  {
 
     private List<SonExpenseAccount> sonList;
 
+
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
     public BigDecimal getAmount() {
         return amount;
     }

+ 29 - 7
src/main/java/com/goafanti/expenseAccount/bo/SonExpenseAccount.java

@@ -1,6 +1,9 @@
 package com.goafanti.expenseAccount.bo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 public class SonExpenseAccount {
@@ -13,8 +16,8 @@ public class SonExpenseAccount {
     private Integer type;
     private String typeOther;
     private String userNames;
-    private String releaseStart;
-    private String releaseEnd;
+    private Date releaseStart;
+    private Date releaseEnd;
     private String districtName;
     private Integer secondaryType;
     private String secondaryTypeOther;
@@ -23,6 +26,8 @@ public class SonExpenseAccount {
     private String plan;
     private String contractNo;
     private String orderNo;
+    private String buyerName;
+    private String buyerId;
     private Integer debitId;
     private Integer publicReleaseType;
     private BigDecimal debitRealAmount;
@@ -30,6 +35,22 @@ public class SonExpenseAccount {
     private Integer debitLiquidationStatus;
     private List<SonExpenseAccountDetails> detList;
 
+    public String getBuyerId() {
+        return buyerId;
+    }
+
+    public void setBuyerId(String buyerId) {
+        this.buyerId = buyerId;
+    }
+
+    public String getBuyerName() {
+        return buyerName;
+    }
+
+    public void setBuyerName(String buyerName) {
+        this.buyerName = buyerName;
+    }
+
     public Integer getPrid() {
         return prid;
     }
@@ -205,20 +226,21 @@ public class SonExpenseAccount {
     public void setUserNames(String userNames) {
         this.userNames = userNames;
     }
-
-    public String getReleaseStart() {
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    public Date getReleaseStart() {
         return releaseStart;
     }
 
-    public void setReleaseStart(String releaseStart) {
+    public void setReleaseStart(Date releaseStart) {
         this.releaseStart = releaseStart;
     }
 
-    public String getReleaseEnd() {
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    public Date getReleaseEnd() {
         return releaseEnd;
     }
 
-    public void setReleaseEnd(String releaseEnd) {
+    public void setReleaseEnd(Date releaseEnd) {
         this.releaseEnd = releaseEnd;
     }
 

+ 19 - 0
src/main/java/com/goafanti/expenseAccount/controller/ExpenseAccountController.java

@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
@@ -346,6 +347,24 @@ public class ExpenseAccountController extends CertifyApiController {
         return res.data(expenseAccountService.mainExpense(id));
     }
 
+
+
+    /**
+     * 主报销详情导出PDF,未完待续
+     */
+    @RequestMapping(value = "/mainExpenseExport",method = RequestMethod.GET)
+    public Result mainExpenseExport(Integer id, HttpServletResponse response){
+        Result res =new Result();
+        if (id==null){
+            res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR,"合并编号"));
+            return  res;
+        }
+        return res.data(expenseAccountService.mainExpenseExport(id,response));
+    }
+
+
+
+
     /**
      * 修改主报销
      */

+ 66 - 0
src/main/java/com/goafanti/expenseAccount/controller/ExpenseCountsController.java

@@ -0,0 +1,66 @@
+package com.goafanti.expenseAccount.controller;
+
+import com.goafanti.common.bo.Result;
+import com.goafanti.common.controller.CertifyApiController;
+import com.goafanti.common.utils.excel.NewExcelUtil;
+import com.goafanti.expenseAccount.bo.ExpenseCountsBo;
+import com.goafanti.expenseAccount.bo.ExpenseCountsDep;
+import com.goafanti.expenseAccount.bo.ExpenseCountsInput;
+import com.goafanti.expenseAccount.bo.ExpenseCountsOrder;
+import com.goafanti.expenseAccount.service.ExpenseCountsService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/admin/expenseCounts")
+public class ExpenseCountsController extends CertifyApiController {
+
+    @Autowired
+    private ExpenseCountsService expenseAccountService;
+    @Value(value = "${upload.path}")
+    private final String	uploadPath			= null;
+    @RequestMapping(value = "/getCounts",method = RequestMethod.GET)
+    public Result<ExpenseCountsBo> getCounts(ExpenseCountsInput in){
+        Result res=new Result();
+        return res.data(expenseAccountService.getCounts(in));
+    }
+
+
+    @RequestMapping(value = "/getCounts/Export",method = RequestMethod.GET)
+    public Result<ExpenseCountsBo> getCountsExport(ExpenseCountsInput in){
+        NewExcelUtil excelUtil =null;
+            List<ExpenseCountsBo> list  = (List<ExpenseCountsBo>) expenseAccountService.getCounts(in);
+        if (in.getTargetType()==1){
+            excelUtil=new NewExcelUtil(ExpenseCountsOrder.class);
+            List<ExpenseCountsOrder>orderList = new ArrayList<>();
+            for (ExpenseCountsBo expenseCountsBo : list) {
+                ExpenseCountsOrder order = new ExpenseCountsOrder();
+                BeanUtils.copyProperties(expenseCountsBo,order);
+                orderList.add(order);
+            }
+            return excelUtil.exportExcel(orderList, "报销总计", uploadPath);
+        }else {
+            excelUtil=new NewExcelUtil(ExpenseCountsDep.class);
+            List<ExpenseCountsDep>depList = new ArrayList<>();
+            for (ExpenseCountsBo expenseCountsBo : list) {
+                ExpenseCountsDep dep=new ExpenseCountsDep();
+                BeanUtils.copyProperties(expenseCountsBo,dep);
+                depList.add(dep);
+            }
+            return excelUtil.exportExcel(depList, "报销总计", uploadPath);
+        }
+    }
+
+    @RequestMapping(value = "/getCountsClear",method = RequestMethod.GET)
+    public Result<ExpenseCountsBo> getCountsClear(){
+        Result res=new Result();
+        return res.data(expenseAccountService.getCountsClear());
+    }
+}

+ 3 - 0
src/main/java/com/goafanti/expenseAccount/service/ExpenseAccountService.java

@@ -4,6 +4,7 @@ import com.goafanti.common.model.ExpenseAccount;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.expenseAccount.bo.*;
 
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -74,4 +75,6 @@ public interface ExpenseAccountService {
     Object updateTypeOther(Integer id, String typeOther,String remarks,String orderNo);
 
     Object updateDetailsTypeOther(Integer id, String typeOther);
+
+    Object mainExpenseExport(Integer id, HttpServletResponse response);
 }

+ 10 - 0
src/main/java/com/goafanti/expenseAccount/service/ExpenseCountsService.java

@@ -0,0 +1,10 @@
+package com.goafanti.expenseAccount.service;
+
+import com.goafanti.expenseAccount.bo.ExpenseCountsInput;
+
+public interface ExpenseCountsService {
+    Object getCounts(ExpenseCountsInput in);
+
+    Object getCountsClear();
+
+}

+ 251 - 41
src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java

@@ -12,7 +12,9 @@ import com.goafanti.common.enums.NoticeTypes;
 import com.goafanti.common.error.BusinessException;
 import com.goafanti.common.model.*;
 import com.goafanti.common.utils.*;
+import com.goafanti.common.utils.excel.FileUtils;
 import com.goafanti.common.utils.excel.NewExcelUtil;
+import com.goafanti.common.utils.pdf.PDFUtils;
 import com.goafanti.core.mybatis.BaseMybatisDao;
 import com.goafanti.core.mybatis.JDBCIdGenerator;
 import com.goafanti.core.mybatis.page.Pagination;
@@ -23,13 +25,25 @@ import com.goafanti.expenseAccount.Enums.EAsecondaryTypes;
 import com.goafanti.expenseAccount.bo.*;
 import com.goafanti.expenseAccount.service.ExpenseAccountService;
 import com.goafanti.organization.bo.OrganizationListOut;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPRow;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -391,13 +405,22 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
     public Object updateTypeOther(Integer id, String typeOther,String remarks,String orderNo) {
         ExpenseAccount ea = new ExpenseAccount();
         ea.setId(id);
-        if (StringUtils.isNotEmpty(typeOther))ea.setTypeOther(typeOther);
-        if (StringUtils.isNotEmpty(remarks))ea.setRemarks(remarks);
-        if (StringUtils.isNotEmpty(orderNo)){
+        if (StringUtils.isNotEmpty(typeOther)){
+            ea.setTypeOther(typeOther);
+            expenseAccountMapper.updateByPrimaryKeySelective(ea);
+        }
+        if (StringUtils.isNotEmpty(remarks)){
+            ea.setRemarks(remarks);
+            expenseAccountMapper.updateByPrimaryKeySelective(ea);
+        }
+        if (StringUtils.isBlank(orderNo)){
+            ea.setTargetType(0);
+            expenseAccountMapper.updateRemoveOrderNo(ea);
+        }else {
             ea.setOrderNo(orderNo);
             ea.setTargetType(1);
+            expenseAccountMapper.updateByPrimaryKeySelective(ea);
         }
-        expenseAccountMapper.updateByPrimaryKeySelective(ea);
         if (StringUtils.isNotEmpty(typeOther)){
             MainExpenseAccount mainExpenseAccount = expenseAccountMapper.selectbySonId(id);
             StringBuffer types=new StringBuffer();
@@ -430,6 +453,196 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
         return expenseAccountDetailsMapper.updateByPrimaryKeySelective(in);
     }
 
+    @Override
+    public Object mainExpenseExport(Integer id, HttpServletResponse response) {
+        MainExpenseAccount mainExpenseAccount = mainExpense(id);
+        pushMainExpenseExport(mainExpenseAccount,response,uploadPath);
+        return 1;
+    }
+
+    public void pushMainExpenseExport(MainExpenseAccount mainExpenseAccount,HttpServletResponse response, String uploadPath) {
+        String title = "报销明细表";
+        String attName = String.format("报销明细表_%s.pdf",new Date().getTime());
+        String realFileName = uploadPath+"/tmp/"+new Date().getTime() + ".pdf";
+
+        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+        Document document=new Document();
+        try {
+            FileUtils.setAttachmentResponseHeader(response, title,attName);
+            FileOutputStream outputStream = new FileOutputStream(realFileName);
+            PdfWriter.getInstance(document, outputStream);
+            document.open();
+            Paragraph paragraph = new Paragraph(title, PDFUtils.getTitleFont());
+            paragraph.setAlignment(1);
+            document.add(paragraph);
+            //默认算60
+            PDFUtils.pushExpenseTitle(document,mainExpenseAccount);
+            PdfPTable table = new PdfPTable(12);
+            table.setWidthPercentage(100);
+            ArrayList<PdfPRow> rows = table.getRows();
+            float[] columnWidths ={12,24,14,50,50,42,28,18,12,12,50,50};
+            table.setWidths(columnWidths);
+            table.setSpacingBefore(10f);
+            table.setSpacingAfter(10f);
+            //填充表格头部
+            addTitle(rows);
+            //获取填充数据
+            List<Map<Integer,String>> mapList = pushMainExpenseAccount(mainExpenseAccount);
+            //填充数据写入表格
+            pushTable(rows,mapList);
+            document.add(table);
+            document.close();
+            outputStream.close();
+//            FileUtils.writeBytes(realFileName, response.getOutputStream());
+//            FileUtils.deleteFile(realFileName);
+        } catch (DocumentException | IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private static void addTitle(ArrayList<PdfPRow> rows) {
+        PdfPCell[] cells =new PdfPCell[12];
+        PdfPRow row=new PdfPRow(cells);
+        cells[0] = new PdfPCell(new Phrase("序号",PDFUtils.getFont(8)));
+        cells[1] = new PdfPCell(new Phrase("费用时间",PDFUtils.getFont(8)));
+        cells[2] = new PdfPCell(new Phrase("时长",PDFUtils.getFont(8)));
+        cells[3] = new PdfPCell(new Phrase("出差地址",PDFUtils.getFont(8)));
+        cells[4] = new PdfPCell(new Phrase("出差企业",PDFUtils.getFont(8)));
+        cells[5] = new PdfPCell(new Phrase("合同编号",PDFUtils.getFont(8)));
+        cells[6] = new PdfPCell(new Phrase("类型",PDFUtils.getFont(8)));
+        cells[7] = new PdfPCell(new Phrase("详情",PDFUtils.getFont(8)));
+        cells[8] = new PdfPCell(new Phrase("费用",PDFUtils.getFont(8)));
+        cells[9] = new PdfPCell(new Phrase("实报",PDFUtils.getFont(8)));
+        cells[10] = new PdfPCell(new Phrase("出差事由",PDFUtils.getFont(8)));
+        cells[11] = new PdfPCell(new Phrase("报销订单/部门",PDFUtils.getFont(8)));
+        rows.add(row);
+    }
+
+    private void pushTable(ArrayList<PdfPRow> rows, List<Map<Integer, String>> mapList) {
+        for (Map<Integer, String> map : mapList) {
+            PdfPCell[] cells =new PdfPCell[12];
+            PdfPRow row=new PdfPRow(cells);
+            for (int i = 0; i < 12; i++) {
+                cells[i] = new PdfPCell(new Phrase(map.get(i),PDFUtils.getFont(8)));
+            }
+            rows.add(row);
+        }
+    }
+
+    private List<Map<Integer, String>> pushMainExpenseAccount(MainExpenseAccount mainExpenseAccount) {
+        List<Map<Integer,String>> mapList = new ArrayList<>();
+        if (mainExpenseAccount.getSonList()!=null){
+            int index=0;
+            for (SonExpenseAccount e : mainExpenseAccount.getSonList()) {
+                List<SonExpenseAccountDetails> detList = e.getDetList();
+                //详情计算,详情完成后需要一个统计
+                int detIndex = 0;
+                for (SonExpenseAccountDetails det : detList) {
+                    index++;
+                    detIndex++;
+                    Map<Integer, String> map = new HashMap<>();
+                    map.put(0, String.valueOf(index));
+                    if (detIndex==1){
+                        if (e.getPublicReleaseType()!=null){
+                            map.put(1,DateUtils.formatDate(e.getReleaseStart(),AFTConstants.YYYYMMDDHHMM)+"~"+DateUtils.formatDate(e.getReleaseEnd(),AFTConstants.YYYYMMDDHHMM));
+                            map.put(2,e.getDuration());
+                            map.put(3,e.getDistrictName());
+                            map.put(4,e.getUserNames());
+                            map.put(6,getExpenseType(e));
+                        }else {
+                            map.put(1,det.getAgreeTime());
+                            map.put(2,"");
+                            map.put(3,"");
+                            map.put(4,"");
+                            map.put(6,"");
+                        }
+                    }else {
+                        map.put(1,det.getAgreeTime());
+                        map.put(2,"");
+                        map.put(3,"");
+                        map.put(4,"");
+                        map.put(6,"");
+                    }
+
+                    map.put(5,e.getContractNo());
+                    map.put(7,getExpenseSecondaryType(e,det));
+                    map.put(8,getBigDecimalZeros(det.getAmount()));
+                    map.put(9,getBigDecimalZeros(det.getRealAmount()));
+                    map.put(10,e.getPlan());
+                    if (index==1){
+                        map.put(11,getOrderNoAndDepartment(e,mainExpenseAccount.getApplyDepName()));
+                    }else {
+                        map.put(11,"");
+                    }
+                    mapList.add(map);
+                    if (detIndex==detList.size()){
+                        index++;
+                        addCount(e.getAmount(),e.getRealAmount(),mapList,index);
+                    }
+                }
+            }
+            //循环结束新增合计
+            index++;
+            addCount(mainExpenseAccount.getAmount(),mainExpenseAccount.getRealAmount(),mapList,index,1);
+        }
+        return  mapList;
+    }
+
+    private String getBigDecimalZeros(BigDecimal amount) {
+        return amount.stripTrailingZeros().toEngineeringString();
+    }
+
+    private void addCount(BigDecimal amount,BigDecimal realAmount,List<Map<Integer, String>> mapList,int index) {
+        addCount(amount,realAmount,mapList,index,0);
+    }
+    private void addCount(BigDecimal amount,BigDecimal realAmount,List<Map<Integer, String>> mapList,int index,int type) {
+        String str="小计";
+        if (type==1)str="合计";
+        Map<Integer, String> map = new HashMap<>();
+        for (int i = 0; i < 12; i++){
+            if (i==0){
+                map.put(i, String.valueOf(index));
+            }else if (i==7){
+                map.put(i, str);
+            }else if (i==8){
+                map.put(i, getBigDecimalZeros(amount));
+            }else if (i==9){
+                map.put(i, getBigDecimalZeros(realAmount));
+            }else {
+                map.put(i, "");
+            }
+        }
+        mapList.add(map);
+    }
+
+
+
+    private String getOrderNoAndDepartment(SonExpenseAccount e,String applyDepName) {
+        return e.getOrderNo()+"\n"+applyDepName;
+    }
+
+    private String getExpenseSecondaryType(SonExpenseAccount e,SonExpenseAccountDetails det) {
+        if (e.getType()==1){
+            if (det.getType()==1){
+                //交通工具待完善
+            }
+        }
+        if (e.getSecondaryType()==0){
+            return EAsecondaryTypes.getDescByCode(e.getSecondaryType())+"("+e.getSecondaryTypeOther()+")";
+        }
+        return EAsecondaryTypes.getDescByCode(e.getSecondaryType());
+    }
+
+
+    private String getExpenseType(SonExpenseAccount e) {
+        if (e.getType()==0){
+            return EATypes.getDescByCode(e.getType())+"("+e.getTypeOther()+")";
+        }
+        return EATypes.getDescByCode(e.getType());
+    }
+
+
 
     private void pushResettingDebit(InputExpenseAccount in, Integer debitId) {
         ExpenseAccount debit = expenseAccountMapper.selectByPrimaryKey(debitId);
@@ -1323,17 +1536,24 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
         if (in.getStartTime()!=null)params.put("startTime",in.getStartTime());
         if (in.getEndTime()!=null)params.put("endTime",in.getEndTime());
         if (in.getCheckNo()!=null)params.put("checkNo",in.getCheckNo());
+        params.put("current",TokenManager.getAdminId());
+        if (in.getMyType()!=null){
+            params.put("myType",in.getMyType());
+        }else {
+            params.put("myType",0);
+        }
         //0=自己 1=财务 2=财务经理 3=超管
         if (TokenManager.hasRole(AFTConstants.SUPERADMIN)||TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)){
             params.put("roleType",3);
         }else if (TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)){
             params.put("roleType",2);
-            params.put("current",TokenManager.getAdminId());
+
         }else if (TokenManager.hasRole(AFTConstants.FINANCE)){
             params.put("roleType",1);
             params.put("current",TokenManager.getAdminId());
         }else{
             params.put("roleType",0);
+            params.put("aid",TokenManager.getAdminId());
         }
         return findPagePlus("ExpenseDetailsList","ExpenseDetailsCount","ExpenseDetailsTotalAmount",params,in.getPageNo(),in.getPageSize());
     }
@@ -1430,33 +1650,37 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
         }
         if (in.getStatus()!=null)param.put("status",in.getStatus());
         //如果前端未传 0自己 1审核的参数,默认自己,在审核列表的时候判断Aid,在
-        if (in.getProcessStatus()==null) in.setProcessStatus(0);
-         if(in.getProcessStatus()==2){
-             if(TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)){
-                 //财务经理查看权限
-                 in.setProcessStatus(5);
-             }else if(TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)||TokenManager.hasRole(AFTConstants.SUPERADMIN)||
-                     TokenManager.hasRole(AFTConstants.VICE_CEO)|| TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)){
-                 //财务管理员和超级管理员查看全部
-                 in.setProcessStatus(6);
-             }else if (TokenManager.hasRole(AFTConstants.FINANCE)){
-                 //0 设置为财务查看
-                 param.put("roleType",0);
-             }
-                if (in.getAid()!=null){
-                    param.put("aid",in.getAid());
-                }
+        param.put("auditor",TokenManager.getAdminId());
+        if(TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)){
+             //财务经理查看权限
+             in.setProcessStatus(5);
              param.put("auditor",TokenManager.getAdminId());
-        }else if(in.getProcessStatus()==1) {
+         }else if(TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)||TokenManager.hasRole(AFTConstants.SUPERADMIN)||
+                 TokenManager.hasRole(AFTConstants.VICE_CEO)|| TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)){
+             //财务管理员和超级管理员查看全部
+             in.setProcessStatus(6);
              param.put("auditor",TokenManager.getAdminId());
-             if (in.getAid()!=null){
-                 param.put("aid",in.getAid());
-             }
+         }else if (TokenManager.hasRole(AFTConstants.FINANCE)){
+             //0 设置为财务查看
+
+             param.put("auditor",TokenManager.getAdminId());
+             //如果是空设置为
+             if (in.getProcessStatus()==null)in.setProcessStatus(2);
          }else {
-            param.put("aid",TokenManager.getAdminId());
+            in.setProcessStatus(0);
+        }
+         if (in.getRoleType()==null){
+             param.put("roleType",0);
+         }else {
+             param.put("roleType",in.getRoleType());
+         }
+         if(in.getProcessStatus()==2||in.getProcessStatus()==1){
+                if (in.getAid()!=null){
+                    param.put("aid",in.getAid());
+                }
         }
-        param.put("processStatus",in.getProcessStatus());
 
+        param.put("processStatus",in.getProcessStatus());
         if (in.getExamineStatus()!=null){
             param.put("examineStatus",in.getExamineStatus());
         }else {
@@ -1475,20 +1699,6 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
         if (in.getExpenseMain()!=null)param.put("expenseMain",in.getExpenseMain());
     }
 
-    /**
-     * 检查权限判断是否是总裁、董事长或超级管理员权限
-     * @return
-     */
-    private boolean checkShiroCED() {
-        if (TokenManager.hasRole(AFTConstants.CED)||TokenManager.hasRole(AFTConstants.CED_ASSISTANT)||
-                TokenManager.hasRole(AFTConstants.SUPERADMIN)||TokenManager.hasRole(AFTConstants.APPROVAL_DECISION_ASSISTANT)
-        ||TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)){
-            return true;
-        }
-        return false;
-    }
-
-
     @Override
     @Cacheable(value = "expenseAccountStatistics#300", key = "'page:'+#name+',depId'+#depId+',startTime'+#startTime+',endTime'+#endTime+'lander'+#lander")
     public List<OutExpenseAccountStatistics> statistics(String name,String depId,String startTime,String endTime,String lander) {

+ 36 - 0
src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseCountsServiceImpl.java

@@ -0,0 +1,36 @@
+package com.goafanti.expenseAccount.service.impl;
+
+import com.goafanti.common.dao.TOrderNewMapper;
+import com.goafanti.common.utils.LoggerUtils;
+import com.goafanti.expenseAccount.bo.ExpenseCountsInput;
+import com.goafanti.expenseAccount.service.ExpenseCountsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ExpenseCountsServiceImpl implements ExpenseCountsService {
+
+    @Autowired
+    private TOrderNewMapper tOrderNewMapper;
+    @Override
+    @Cacheable(value = "getCounts#300", key = "'getCounts:key='+#in.buyerName+#in.startTime+#in.endTime+#in.depId+#in.contactNo+#in.targetType")
+    public Object getCounts(ExpenseCountsInput in) {
+        if (in.getTargetType()==null)in.setTargetType(1);
+        if (in.getTargetType()==1){
+            return tOrderNewMapper.selectExpenseCount(in);
+        }else {
+            return tOrderNewMapper.selectExpenseDepCount(in);
+        }
+    }
+
+    @Override
+    @CacheEvict(value = "getCounts#300",allEntries = true)
+    public Object getCountsClear() {
+        LoggerUtils.debug(getClass(),"报销统计缓存清除。");
+        return 1;
+    }
+
+
+}

+ 5 - 5
src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java

@@ -1268,14 +1268,14 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 	public void addTimingTaskNewDunNoticAndSendEmail(OutNewOrderDunBo o, Integer type) {
 		AdminListBo a = adminMapper.getDeptNameByAid("1");
 		TOrderNewBo b  = tOrderNewMapper.getSaleIdByOno(o.getOrderNo());
-		StringBuffer sb=new StringBuffer();
+		StringBuilder sb=new StringBuilder();
 		Integer noticType=NoticeStatus.ORDER_DUN.getCode();
 		if (type==1){
 			noticType=NoticeStatus.MENBER_DUN.getCode();
-			sb=sb.append("客户名称【").append(b.getUserName()).append("】催款截点将于").append(o.getCustomizeTimes()).append("进行催款,会员项目请提前2个月催款,以免延误会员派单");
-		}else {
-			sb=sb.append("客户名称【").append(b.getUserName()).append("】,按时触发应收款欠款,请按时催款,并及时增减项目,以免项目延期等问题。");
-		}
+            sb.append("客户名称【").append(b.getUserName()).append("】催款截点将于").append(o.getCustomizeTimes()).append("进行催款,会员项目请提前2个月催款,以免延误会员派单");
+        }else {
+            sb.append("客户名称【").append(b.getUserName()).append("】,按时触发应收款欠款,请按时催款,并及时增减项目,以免项目延期等问题。");
+        }
 		addNotic(noticType, b,sb.toString());
 		try {
 			NewDunsendEmail(o.getOrderNo(),o.getId(), a, b,noticType,sb.toString());

+ 19 - 1
src/main/java/com/goafanti/order/service/impl/OrderProjectServiceImpl.java

@@ -276,9 +276,12 @@ public class OrderProjectServiceImpl extends BaseMybatisDao<TOrderTaskMapper> im
 	 */
 	private void pushUser(TOrderTask t, TOrderNew tn, Date date) {
 		if (userMapper.checkLock(tn.getBuyerId())<1) {
-			userLockReleaseMapper.updateByAidAndUid(tn.getSalesmanId(),tn.getBuyerId());
+			//释放改成强制释放所有客户锁
+			userLockReleaseMapper.updateByAidAndUid(tn.getBuyerId());
 			userMapper.updateShareType(tn.getBuyerId(),tn.getSalesmanId());
 		}
+		//判定用户最后签单时间
+		pushSignTime(tn);
 		//未锁定业务就锁定业务
 		if (userLockReleaseMapper.checkLock(tn.getSalesmanId(),tn.getBuyerId(),t.getCommodityId())<1) {
 			UserLockRelease ulr=new UserLockRelease();
@@ -312,6 +315,21 @@ public class OrderProjectServiceImpl extends BaseMybatisDao<TOrderTaskMapper> im
 			publicReleaseMapper.updateSignByAidAndUid(tn.getBuyerId(),tn.getSalesmanId());
 	}
 
+	private void pushSignTime(TOrderNew tn) {
+		List<TOrderNewBo> tOrderNewBos = tOrderNewMapper.selectByuidandAid(tn.getBuyerId(), tn.getSalesmanId());
+		Date lastSigningTime= tn.getSignTime();
+		if (!tOrderNewBos.isEmpty()){
+			for (TOrderNewBo e : tOrderNewBos) {
+				if (e.getSignTime().getTime()>lastSigningTime.getTime()){
+					lastSigningTime = e.getSignTime();
+				}
+			}
+		}
+		User u=new User();
+		u.setId(tn.getBuyerId());
+		u.setSignTime(lastSigningTime);
+		userMapper.updateByPrimaryKeySelective(u);
+	}
 
 
 	private void addtaskAttributionLog(Integer taskId, String taskReceiverId, String remarks, Integer type, Date date) {

+ 10 - 0
src/main/java/com/goafanti/organization/bo/InputDep.java

@@ -21,6 +21,7 @@ public class InputDep {
     private String id;
     private String abbreviation;
     private String financeId;
+    private String retrialFinanceId;
     private Integer workingHoursType;
     private Integer hideSign;
     @NotNull(message = "{"+ ErrorConstants.PARAM_EMPTY_ERROR+"}")
@@ -53,6 +54,15 @@ public class InputDep {
      */
     private Integer cashierExamine;
 
+
+    public String getRetrialFinanceId() {
+        return retrialFinanceId;
+    }
+
+    public void setRetrialFinanceId(String retrialFinanceId) {
+        this.retrialFinanceId = retrialFinanceId;
+    }
+
     public String getName() {
         return name;
     }

+ 51 - 9
src/main/java/com/goafanti/organization/service/impl/OrganizationServiceImpl.java

@@ -3,6 +3,8 @@ package com.goafanti.organization.service.impl;
 import com.goafanti.admin.bo.AdminListBo;
 import com.goafanti.common.dao.DepartmentMapper;
 import com.goafanti.common.dao.ExpenseConfigDetailsMapper;
+import com.goafanti.common.dao.TOrderMidMapper;
+import com.goafanti.common.dao.TOrderNewMapper;
 import com.goafanti.common.model.Department;
 import com.goafanti.common.model.ExpenseConfigDetails;
 import com.goafanti.common.utils.AsyncUtils;
@@ -29,6 +31,10 @@ public class OrganizationServiceImpl extends BaseMybatisDao<DepartmentMapper> im
 	private DepartmentMapper departmentMapper;
 	@Autowired
 	private ExpenseConfigDetailsMapper expenseConfigDetailsMapper;
+	@Autowired
+	private TOrderNewMapper torderNewMapper;
+	@Autowired
+	private TOrderMidMapper torderMidMapper;
 
 	@Autowired
 	private AsyncUtils asyncUtils;
@@ -202,6 +208,7 @@ public class OrganizationServiceImpl extends BaseMybatisDao<DepartmentMapper> im
 	public int updateOrganization(InputDep in) {
 		//获取上级编号
 		Department superDep=departmentMapper.selectByPrimaryKey(in.getSuperId());
+		Department useDep = departmentMapper.selectByPrimaryKey(in.getId());
 		Date now=new Date();
 		Department dep=new Department();
 		dep.setLvl(superDep.getLvl()+1);
@@ -215,14 +222,53 @@ public class OrganizationServiceImpl extends BaseMybatisDao<DepartmentMapper> im
 		dep.setSuperId(in.getSuperId());
 		dep.setDepNo(in.getDepNo());
 		dep.setAbbreviation(in.getAbbreviation());
-		dep.setFinanceId(in.getFinanceId());
 		dep.setProvince(in.getProvince());
 		dep.setHideSign(in.getHideSign());
 		dep.setWorkingHoursType(in.getWorkingHoursType());
 		dep.setApproval(in.getApproval());
 		dep.setApprovalAid(in.getApprovalAid());
+		//财务与复审切换的时候要切换所有未审核的财务
+		boolean updateFinance=false;
+		boolean updateRetrialFinance=false;
+		if(StringUtils.isNotBlank(in.getFinanceId())&&!useDep.getFinanceId().equals(in.getFinanceId())){
+			dep.setFinanceId(in.getFinanceId());
+			//处理订单
+			departmentMapper.updateOrderDepFinanceNotExamine(in.getFinanceId(),useDep.getFinanceId());
+			List<String> list = torderNewMapper.selectByFinanceNotExamine(in.getFinanceId());
+			torderNewMapper.updateOrderDepFinanceExamineName(list);
+			updateFinance=true;
+		}
+		if (StringUtils.isNotBlank(in.getRetrialFinanceId())&&
+				!useDep.getRetrialFinanceId().equals(in.getRetrialFinanceId())){
+			dep.setRetrialFinanceId(in.getRetrialFinanceId());
+			departmentMapper.updateOrderDepFinanceNotExamine(in.getRetrialFinanceId(),useDep.getRetrialFinanceId());
+			List<String> list = torderNewMapper.selectByFinanceNotExamine(in.getRetrialFinanceId());
+			torderNewMapper.updateOrderDepFinanceExamineName(list);
+			updateRetrialFinance=true;
+		}
 		dep.setExpenseFinanceId(in.getExpenseFinanceId());
-		checkFinaceUpdate(in.getId(),in.getFinanceId());
+		//获取需要重新刷新的财务
+		List<String> aids =new ArrayList<>();
+		if (updateFinance){
+			if (aids.contains(in.getFinanceId())){
+				aids.add(in.getFinanceId());
+			}
+			if(!aids.contains(useDep.getFinanceId())){
+				aids.add(useDep.getFinanceId());
+			}
+			torderMidMapper.updateFinanceId(in.getId(),in.getFinanceId());
+			asyncUtils.updateFinanceExamine(in.getFinanceId());
+		}
+		if(updateRetrialFinance){
+			if (aids.contains(in.getRetrialFinanceId())){
+				aids.add(in.getRetrialFinanceId());
+			}
+			if(!aids.contains(useDep.getRetrialFinanceId())){
+				aids.add(useDep.getRetrialFinanceId());
+			}
+		}
+		//
+		checkFinaceUpdate(aids);
 		if (in.getExpenseRetrialFinanceExamine()==1){
 			dep.setExpenseRetrialFinanceExamine(in.getExpenseRetrialFinanceExamine());
 		}
@@ -244,14 +290,10 @@ public class OrganizationServiceImpl extends BaseMybatisDao<DepartmentMapper> im
 
 	/**
 	 * 如果更换了负责人刷新中间表
-	 * @param id 部门编号
-	 * @param financeId  财务编号
 	 */
-	private void checkFinaceUpdate(String id, String financeId) {
-		Department dep = departmentMapper.selectByPrimaryKey(id);
-		if (financeId!=null&&!financeId.equals(dep.getFinanceId())){
-			asyncUtils.updateFinanceExamineAndDep(id,financeId,dep.getFinanceId());
-		}
+	private void checkFinaceUpdate(List<String> aids) {
+		asyncUtils.financeCoutSwitch(aids);
+
 	}
 
 	@Override

+ 21 - 0
src/main/java/com/goafanti/weChat/bo/OutPublicDtails.java

@@ -9,6 +9,10 @@ public class OutPublicDtails  {
 	private Integer id;
 	@Excel(name = "客户名称")
 	private String userName;
+	@Excel(name = "签单状态",readConverterExp = "0=未签单,1=已签单",width = 8)
+	private Integer signBills;
+	@Excel(name = "签单时间")
+	private String signTime;
 	@Excel(name = "公出地点")
 	private String districtName;
 	@Excel(name = "跟单人")
@@ -64,6 +68,23 @@ public class OutPublicDtails  {
 	@Excel(name = "订单总金额" ,scale = 6)
 	private BigDecimal totalAmout;
 
+
+	public Integer getSignBills() {
+		return signBills;
+	}
+
+	public void setSignBills(Integer signBills) {
+		this.signBills = signBills;
+	}
+
+	public String getSignTime() {
+		return signTime;
+	}
+
+	public void setSignTime(String signTime) {
+		this.signTime = signTime;
+	}
+
 	public Integer getObjectType() {
 		return objectType;
 	}

+ 8 - 0
src/main/java/com/goafanti/weChat/controller/AdminReleaseApiController.java

@@ -268,6 +268,14 @@ public class AdminReleaseApiController extends CertifyApiController{
 		return res;
 	}
 
+
+	@RequestMapping(value = "/publicReleaseAndCount", method = RequestMethod.GET)
+	public Result publicReleaseAndCount(InputPublicDtails in){
+		Result res =new Result();
+		res.data(publicReleaseService.publicReleaseAndCount(in));
+		return res;
+	}
+
 	/**
 	 * 公出详情列表
 	 * @return

+ 4 - 2
src/main/java/com/goafanti/weChat/service/PublicReleaseService.java

@@ -1,10 +1,10 @@
 package com.goafanti.weChat.service;
 
+import com.goafanti.weChat.bo.*;
+
 import java.util.List;
 import java.util.Map;
 
-import com.goafanti.weChat.bo.*;
-
 public interface PublicReleaseService {
 
 	Map<String, Object> addPublicRelease(InputPublicRelease in);
@@ -62,4 +62,6 @@ public interface PublicReleaseService {
 	boolean checkaddAssistant(Integer id, String aid);
 
     int updateLocation(InputPublicRelease in);
+
+	Object publicReleaseAndCount(InputPublicDtails in);
 }

+ 53 - 0
src/main/java/com/goafanti/weChat/service/impl/PublicReleaseServiceImpl.java

@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.socket.TextMessage;
 
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -1441,5 +1442,57 @@ public class PublicReleaseServiceImpl extends BaseMybatisDao<PublicReleaseMapper
 		return publicReleaseDetailsMapper.updateByPrimaryKeySelective(updateprd);
 	}
 
+	@Override
+	public Object publicReleaseAndCount(InputPublicDtails in) {
+		List<OutPublicDtails> list = publicReleaseListDtailsList(in);
+			Map<String,Object> map=new HashMap<String, Object>();
+		if (list.isEmpty()){
+			map.put("list",list);
+			map.put("count",0);
+			map.put("durationCount",0);
+			map.put("peopleCount",0);
+		}else {
+			//公出次数
+			int count=0;
+			BigDecimal durationCount=BigDecimal.ZERO;
+			List<String> aList =new ArrayList<>();
+			for (OutPublicDtails e : list) {
+				if (e.getType()==0||e.getType()==1||e.getType()==2){
+					count++;
+					if (e.getDuration()!=null){
+						durationCount=durationCount.add(new BigDecimal(e.getDuration()));
+					}
+					if (!aList.contains(e.getAname())){
+						aList.add(e.getAname());
+					}
+					if (StringUtils.isNotEmpty(e.getAssistAidName())){
+						String[] split = e.getAssistAidName().split(",");
+						for (String s : split) {
+							if (!aList.contains(s)){
+								aList.add(s);
+							}
+						}
+					}
+					if (StringUtils.isNotEmpty(e.getAssistantName())){
+						String[] split = e.getAssistantName().split(",");
+						for (String s : split) {
+							if (!aList.contains(s)){
+								aList.add(s);
+							}
+						}
+					}
+				}
+
+
+			}
+			map.put("list",list);
+			map.put("count",count);
+			map.put("durationCount",durationCount);
+			map.put("peopleCount",aList.size());
+		}
+
+		return map;
+	}
+
 
 }

+ 5 - 2
src/main/resources/props/config_local.properties

@@ -1,5 +1,9 @@
 dev.name=local
 jdbc.driverClassName=com.mysql.jdbc.Driver
+
+#static.host=//static.jishutao.com/1.3.11
+static.host=//172.16.1.187/1.3.11
+
 #jdbc.url=jdbc\:mysql://localhost:3306/aft20221026?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
 #jdbc.url=jdbc\:mysql://localhost:3306/aft?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
 #jdbc.username=root
@@ -51,8 +55,7 @@ yxjl_max=100
 
 amb.maxLvl=6
 
-#static.host=//static.jishutao.com/1.3.09
-static.host=//172.16.1.187/1.3.09
+
 #avatar.host=//172.16.0.255:3000
 #static.host=//172.16.0.255:3000/1.2.62
 avatar.host=//static.jishutao.com

+ 1 - 1
src/main/resources/props/config_test.properties

@@ -52,7 +52,7 @@ amb.maxLvl=6
 
 portal.host=//static.jishutao.com/portal/2.0.6
 avatar.host=//static.jishutao.com
-static.host=//static.jishutao.com/1.3.09
+static.host=//static.jishutao.com/1.3.11
 rd.static.host=//static.jishutao.com/RD/1.0.03
 avatar.upload.host=//static.jishutao.com/upload