Browse Source

开票功能

user5 4 years ago
parent
commit
14ac65a179

+ 1 - 1
pom.xml

@@ -1057,4 +1057,4 @@
         </dependency>
     </dependencies>
 
-</project>
+</project>

+ 25 - 3
src/main/java/com/jeeplus/modules/workinvoice/dao/WorkInvoiceDao.java

@@ -9,6 +9,7 @@ import java.util.List;
 import com.jeeplus.common.persistence.CrudDao;
 import com.jeeplus.common.persistence.annotation.MyBatisDao;
 import com.jeeplus.modules.workinvoice.entity.WorkInvoice;
+import com.jeeplus.modules.workinvoice.entity.WorkInvoiceProjectRelation;
 
 /**
  * 开票管理DAO接口
@@ -20,9 +21,9 @@ public interface WorkInvoiceDao extends CrudDao<WorkInvoice> {
 
 	public List<WorkClientInfo> findListByclient(WorkClientInfo client);
 	public List<WorkBidProject> findListByproject(WorkBidProject project);
-	
+
 	public WorkInvoice getByProcInsId(String procInsId);
-	
+
 	/**
 	 * 更新流程实例ID
 	 * @param
@@ -42,4 +43,25 @@ public interface WorkInvoiceDao extends CrudDao<WorkInvoice> {
 	 */
 	void receiptMoney(WorkInvoice workInvoice);
 
-}
+	/**
+	 * 根据开票id查询所有开票项目 关联信息
+	 * @param invoiceId
+	 * @return
+	 */
+	List<WorkInvoiceProjectRelation> getProjectRelation(String invoiceId);
+
+	/**
+	 * 根据开票id删除所有开票项目 关联信息
+	 * @param invoiceId
+	 * @return
+	 */
+	int deleteProjectRelation(String invoiceId);
+
+	/**
+	 * 新增开票和项目关联信息
+	 * @param projectRelation
+	 * @return
+	 */
+	int insertProjectRelation(WorkInvoiceProjectRelation projectRelation);
+
+}

+ 82 - 10
src/main/java/com/jeeplus/modules/workinvoice/service/WorkInvoiceService.java

@@ -16,6 +16,8 @@ import com.jeeplus.modules.act.utils.ActUtils;
 import com.jeeplus.modules.projectrecord.entity.ProjectPlanInfo;
 import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
 import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecords;
+import com.jeeplus.modules.ruralprojectrecords.service.RuralProjectRecordsService;
 import com.jeeplus.modules.serialnum.service.SerialNumTplService;
 import com.jeeplus.modules.sys.entity.Office;
 import com.jeeplus.modules.sys.entity.Role;
@@ -32,9 +34,12 @@ import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
 import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
 import com.jeeplus.modules.workbidproject.entity.WorkBidProject;
 import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
 import com.jeeplus.modules.workinvoice.dao.WorkInvoiceDao;
 import com.jeeplus.modules.workinvoice.dao.WorkInvoiceReceiptDao;
 import com.jeeplus.modules.workinvoice.entity.WorkInvoice;
+import com.jeeplus.modules.workinvoice.entity.WorkInvoiceProjectRelation;
 import com.jeeplus.modules.workinvoice.entity.WorkInvoiceReceipt;
 import com.jeeplus.modules.workinvoicedetail.dao.WorkInvoiceDetailDao;
 import com.jeeplus.modules.workinvoicedetail.entity.WorkInvoiceDetail;
@@ -104,6 +109,8 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 	protected SerialNumTplService serialNumTplService;
 	@Autowired
 	protected WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private RuralProjectRecordsService ruralProjectRecordsService;
 
 	private static byte[] SYN_BYTE = new byte[0];
 
@@ -135,6 +142,23 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 					workInvoice.setWorkAccountList(list);
 				}
 			}
+			//根据开票id查询关联项目
+			List<WorkInvoiceProjectRelation> projectRelationList = dao.getProjectRelation(workInvoice.getId());
+			for (WorkInvoiceProjectRelation projectRelation: projectRelationList) {
+				if(StringUtils.isBlank(projectRelation.getClientName())){
+					//无合同查找委托方信息
+					RuralProjectRecords records1 = ruralProjectRecordsService.get(projectRelation.getProjectId());
+					//无合同状态下,获取委托方的名称
+					if (records1.getWorkContractInfo() == null) {
+						ruralProjectRecordsService.queryLinkmanInfos(records1);
+						if (records1.getWorkClientLinkmanList() != null && records1.getWorkClientLinkmanList().size() > 0) {
+							WorkClientLinkman linkman = records1.getWorkClientLinkmanList().get(0);
+							projectRelation.setClientName(linkman.getClientId().getName());
+						}
+					}
+				}
+			}
+			workInvoice.setWorkInvoiceProjectRelationList(projectRelationList);
 		}
 		return workInvoice;
 	}
@@ -162,6 +186,8 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 	public  void save(WorkInvoice workInvoice){
 		super.save(workInvoice);
 		updateWorkInvoiceInfo(workInvoice);
+		//处理项目和开票信息数据
+		updateWorkInvoiceProjectRelationInfo(workInvoice);
 	}
 
 	@Transactional(readOnly = false)
@@ -193,6 +219,42 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 	}
 
 	/**
+	 * 处理项目和开票信息数据
+	 * @param workInvoice
+	 */
+	@Transactional(readOnly = false)
+	public void updateWorkInvoiceProjectRelationInfo(WorkInvoice workInvoice) {
+		//根据开票id删除所有开票项目 关联信息
+		dao.deleteProjectRelation(workInvoice.getId());
+		for (WorkInvoiceProjectRelation projectRelation : workInvoice.getWorkInvoiceProjectRelationList()){
+			if (StringUtils.isBlank(projectRelation.getProjectId())){
+				continue;
+			}
+			//新增开票和项目关联信息
+			dao.insertProjectRelation(projectRelation);
+		}
+	}
+
+	/**
+	 * 获取关联项目名称list
+	 * @param workInvoice
+	 * @return
+	 */
+	public List<String> getProjectNameList(WorkInvoice workInvoice){
+		//项目名称获取
+		List<String> projectNameList = Lists.newArrayList();
+		for (WorkInvoiceProjectRelation projectRelation : workInvoice.getWorkInvoiceProjectRelationList()) {
+			if(StringUtils.isNotBlank(projectRelation.getProjectId())){
+				ProjectRecords projectRecords = projectRecordsService.getRuralMasters(projectRelation.getProjectId());
+				if(null != projectRecords){
+					projectNameList.add(projectRecords.getProjectName());
+				}
+			}
+		}
+		return projectNameList;
+	}
+
+	/**
 	 * 提交存储
 	 * @param workInvoice
 	 * @param variables
@@ -215,6 +277,7 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 			str = "发票申请编号:"+workInvoice.getNumber()+",实际开票单位:"+workInvoice.getClient().getName()+",创建人:"+userName+",所属部门:"+office.getName();
 			String title = "实际开票单位:"+workInvoice.getClient().getName();
 		long s4=System.currentTimeMillis();
+		//处理发票明细
 			updateWorkInvoiceInfo(workInvoice);
 		long s5=System.currentTimeMillis();
 			// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
@@ -413,12 +476,18 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 		//所属部门
 
 		String userName = UserUtils.get(workInvoice.getCreateBy().getId()).getName();
+		//项目名称获取
+		List<String> projectNameList = getProjectNameList(workInvoice);
+		String projectNameStr = String.join(",", projectNameList);
 		ProjectRecords projectRecords = projectRecordsService.getRuralMasters(workInvoice.getProject().getId());
-		String title = "项目【"+ projectRecords.getProjectName() +"】发票申请待审批";
-		str = "项目【"+ projectRecords.getProjectName() +"】发票申请待审批,发票申请编号:"+workInvoice.getNumber();
+		String title = "项目【"+ projectNameStr +"】发票申请待审批";
+		str = "项目【"+ projectNameStr +"】发票申请待审批,发票申请编号:"+workInvoice.getNumber();
 
 		long s4=System.currentTimeMillis();
-			updateWorkInvoiceInfo(workInvoice);
+		//开票明细处理
+		updateWorkInvoiceInfo(workInvoice);
+		//开票与项目关系处理
+		updateWorkInvoiceProjectRelationInfo(workInvoice);
 		long s5=System.currentTimeMillis();
 			// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
 			identityService.setAuthenticatedUserId(UserUtils.getUser().getId());
@@ -973,6 +1042,9 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 				workActivityMenu.setActivities(activitieList);
 			}
 
+		//项目名称获取
+		List<String> projectNameList = getProjectNameList(workInvoice);
+		String projectNameStr = String.join(",", projectNameList);
 			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
 			WorkActivityProcess selectProcess = new WorkActivityProcess();
 			selectProcess.setProcessInstanceId(workInvoice.getProcessInstanceId());
@@ -1092,8 +1164,8 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 		if (!state) {
 				users.add(workInvoice.getCreateBy());
 				if ("yes".equals(workInvoice.getAct().getFlag())) {
-					title = "项目【"+ projectRecords.getProjectName() +"】发票申请通过";
-					str = "项目【"+ projectRecords.getProjectName() +"】发票申请通过,发票申请编号:"+workInvoice.getNumber();
+					title = "项目【"+ projectNameStr +"】发票申请通过";
+					str = "项目【"+ projectNameStr +"】发票申请通过,发票申请编号:"+workInvoice.getNumber();
 					workInvoice.setInvoiceState("5");
 					WorkProjectNotify notify = new WorkProjectNotify();
 					notify.setNotifyId(workInvoice.getId());
@@ -1176,8 +1248,8 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 
 				} else {
 					if (!"yes".equals(workInvoice.getAct().getFlag())) {//驳回待办提醒
-						title = "项目【"+ projectRecords.getProjectName() +"】发票申请被驳回";
-						str = "项目【"+ projectRecords.getProjectName() +"】发票申请被驳回,请选择重新申请或作废";
+						title = "项目【"+ projectNameStr +"】发票申请被驳回";
+						str = "项目【"+ projectNameStr +"】发票申请被驳回,请选择重新申请或作废";
 						WorkProjectNotify notify = new WorkProjectNotify();
 						notify.setNotifyId(workInvoice.getId());
 						userList = workProjectNotifyService.readByNotifyId(notify);
@@ -1195,8 +1267,8 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 						users.add( workInvoice.getCreateBy());
 					} else {
 						if (StringUtils.isNotBlank(enname)) {//驳回重新申请待办
-							title = "项目【"+ projectRecords.getProjectName() +"】发票重新申请,待审批";
-							str = "项目【"+ projectRecords.getProjectName() +"】发票重新申请,待审批,发票申请编号:"+workInvoice.getNumber();;
+							title = "项目【"+ projectNameStr +"】发票重新申请,待审批";
+							str = "项目【"+ projectNameStr +"】发票重新申请,待审批,发票申请编号:"+workInvoice.getNumber();;
 							WorkProjectNotify notify = new WorkProjectNotify();
 							notify.setNotifyId(workInvoice.getId());
 							userList = workProjectNotifyService.readByNotifyId(notify);
@@ -1971,4 +2043,4 @@ public class WorkInvoiceService extends CrudService<WorkInvoiceDao, WorkInvoice>
 	public void cancellationDelete(WorkInvoice workInvoice) {
 		dao.cancellationDelete(workInvoice);
 	}
-}
+}

+ 23 - 13
src/main/java/com/jeeplus/modules/workinvoice/web/WorkInvoiceController.java

@@ -22,6 +22,7 @@ import com.jeeplus.modules.oa.entity.OaNotify;
 import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
 import com.jeeplus.modules.projectrecord.enums.ProjectStatusEnum;
 import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.ruralprojectrecords.entity.RuralProjectRecords;
 import com.jeeplus.modules.sys.entity.Office;
 import com.jeeplus.modules.sys.entity.Role;
 import com.jeeplus.modules.sys.entity.User;
@@ -35,6 +36,7 @@ import com.jeeplus.modules.workbidproject.entity.WorkBidProject;
 import com.jeeplus.modules.workbidproject.service.WorkBidProjectService;
 import com.jeeplus.modules.workclientinfo.entity.WorkClientBank;
 import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
 import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
 import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
 import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
@@ -125,7 +127,7 @@ public class WorkInvoiceController extends BaseController {
 		}
 		return entity;
 	}
-	
+
 	/**
 	 * 开票管理列表页面
 	 */
@@ -591,7 +593,7 @@ public class WorkInvoiceController extends BaseController {
 		addMessage(redirectAttributes, "发票收款成功");
 		return "redirect:"+Global.getAdminPath()+"/workinvoice/workInvoice/?repage";
 	}
-	
+
 	/**
 	 * 批量删除开票管理
 	 */
@@ -605,7 +607,7 @@ public class WorkInvoiceController extends BaseController {
 		addMessage(redirectAttributes, "作废发票管理成功");
 		return "redirect:"+Global.getAdminPath()+"/workinvoice/workInvoice/?repage";
 	}
-	
+
 	/**
 	 * 导出excel文件
 	 */
@@ -655,7 +657,7 @@ public class WorkInvoiceController extends BaseController {
 		}
 		return "redirect:"+Global.getAdminPath()+"/workinvoice/workInvoice/?repage";
     }
-	
+
 	/**
 	 * 下载导入开票管理数据模板
 	 */
@@ -664,7 +666,7 @@ public class WorkInvoiceController extends BaseController {
     public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
 		try {
             String fileName = "发票管理数据导入模板.xlsx";
-    		List<WorkInvoice> list = Lists.newArrayList(); 
+    		List<WorkInvoice> list = Lists.newArrayList();
     		new ExportExcel("发票管理数据", WorkInvoice.class, 1).setDataList(list).write(response, fileName).dispose();
     		return null;
 		} catch (Exception e) {
@@ -672,8 +674,8 @@ public class WorkInvoiceController extends BaseController {
 		}
 		return "redirect:"+Global.getAdminPath()+"/workinvoice/workInvoice/?repage";
     }
-	
-	
+
+
 	/**
 	 * 选择开票单位
 	 */
@@ -862,11 +864,19 @@ public class WorkInvoiceController extends BaseController {
 		HashMap<Object, Object> map = Maps.newHashMap();
 		String obj = request.getParameter("obj");
 		ProjectRecords projectRecords = projectRecordsService.getRuralInfo(obj);
-		map.put("pNumber",projectRecords.getProjectId());//项目编号
-		map.put("prdNumber",projectRecords.getReportData().getNumber());//报告号
-		map.put("cName",projectRecords.getWorkContractInfo().getClient().getName());//委托方
-		map.put("cInfoName",projectRecords.getWorkContractInfo().getName());//合同名称
-		map.put("cMoney",projectRecords.getWorkContractInfo().getContractPrice());//合同名称
+		map.put("projectNum",projectRecords.getProjectId());//项目编号
+		map.put("reportDataNum",projectRecords.getReportData().getNumber());//报告号
+		if(projectRecords.getWorkContractInfo() == null || StringUtils.isBlank(projectRecords.getWorkContractInfo().getClient().getName())){
+			//无合同状态下,获取委托方的名称
+			projectRecordsService.queryLinkmanInfos(projectRecords);
+			if (projectRecords.getWorkClientLinkmanList() != null && projectRecords.getWorkClientLinkmanList().size() > 0) {
+				WorkClientLinkman linkman = projectRecords.getWorkClientLinkmanList().get(0);
+				map.put("clientName",linkman.getClientId().getName());//委托方
+			}
+		}else{
+			map.put("clientName",projectRecords.getWorkContractInfo().getClient().getName());//委托方
+		}
+		map.put("workContractName",projectRecords.getWorkContractInfo().getName());//合同名称
 		String id = projectRecords.getWorkContractInfo().getId();
 		WorkContractInfo workContractInfo = workContractInfoService.get(id);
 		if(workContractInfo!=null){
@@ -1221,4 +1231,4 @@ public class WorkInvoiceController extends BaseController {
 		return "redirect:"+Global.getAdminPath()+"/workinvoice/workInvoice/?repage";
 	}
 
-}
+}

+ 8 - 2
src/main/resources/mappings/modules/ruralprojectrecords/RuralProjectRecordsDao.xml

@@ -681,8 +681,14 @@
 
     <update id="updateProcessIdAndStatus" >
         UPDATE  rural_project_records SET
-          process_instance_id = #{processInstanceId},
-          status = #{projectStatus}
+		update_date = now()
+        <if test="null != processInstanceId and '' != processInstanceId">
+			,process_instance_id = #{processInstanceId}
+		</if>
+        <if test="null != projectStatus and '' != projectStatus">
+			,status = #{projectStatus}
+		</if>
+          ,update_date = now()
         WHERE id = #{id}
     </update>
 

+ 57 - 28
src/main/resources/mappings/modules/workinvoice/WorkInvoiceDao.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jeeplus.modules.workinvoice.dao.WorkInvoiceDao">
-    
+
 	<sql id="workInvoiceColumns">
 		a.id AS "id",
 		a.number AS "number",
@@ -62,7 +62,7 @@
 		(case when a.receipt_money = '0' then '否' when a.receipt_money = '1' then '是' else '否' end) as receiptMoney,
 		a.cancellation_remark as "cancellationRemark"
 	</sql>
-	
+
 	<sql id="workInvoiceJoins">
 		LEFT JOIN sys_user u ON u.id = a.drawer_id
 		LEFT JOIN sys_user su ON su.id = a.create_by
@@ -74,18 +74,18 @@
 		JOIN sys_office s ON s.id = a.company_id
 		LEFT join sys_office so on so.id = a.office_id
 	</sql>
-	
-    
+
+
 	<select id="get" resultType="WorkInvoice" >
-		SELECT 
+		SELECT
 			<include refid="workInvoiceColumns"/>
 		FROM work_invoice a
 		<include refid="workInvoiceJoins"/>
 		WHERE a.id = #{id} and a.del_flag = 0
 	</select>
-	
+
 	<select id="findList" resultType="WorkInvoice" >
-		SELECT 
+		SELECT
 			<include refid="workInvoiceColumns"/>
 		FROM work_invoice a
 		<include refid="workInvoiceJoins"/>
@@ -161,7 +161,7 @@
 				AND a.office_id = #{office.id}
 			</if>
 			<if test="invoiceNumber != null and invoiceNumber != ''">
-				AND a.invoice_number LIKE 
+				AND a.invoice_number LIKE
 					<if test="dbName == 'oracle'">'%'||#{invoiceNumber}||'%'</if>
 					<if test="dbName == 'mssql'">'%'+#{invoiceNumber}+'%'</if>
 					<if test="dbName == 'mysql'">concat('%',#{invoiceNumber},'%')</if>
@@ -301,18 +301,18 @@
 		</choose>
 	</select>
 
-	
-	
-	
-	
+
+
+
+
 	<select id="findAllList" resultType="WorkInvoice" >
-		SELECT 
+		SELECT
 			<include refid="workInvoiceColumns"/>
 		FROM work_invoice a
 		<include refid="workInvoiceJoins"/>
 		<where>
 			a.del_flag = #{DEL_FLAG_NORMAL}
-		</where>		
+		</where>
 		<choose>
 			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
 				ORDER BY ${page.orderBy}
@@ -322,13 +322,13 @@
 			</otherwise>
 		</choose>
 	</select>
-	
+
 	<update id="updateProcessInstanceId">
-		UPDATE work_invoice SET 
+		UPDATE work_invoice SET
 			process_instance_id = #{processInstanceId}
 		WHERE id = #{id}
 	</update>
-	
+
 	<insert id="insert">
 		INSERT INTO work_invoice(
 			id,
@@ -410,9 +410,9 @@
 			#{cancellationRemark}
 		)
 	</insert>
-	
+
 	<update id="update">
-		UPDATE work_invoice SET 	
+		UPDATE work_invoice SET
 			number = #{number},
 			client_id = #{client.id},
 			project_id = #{project.id},
@@ -449,17 +449,17 @@
 			cancellation_remark = #{cancellationRemark}
 		WHERE id = #{id}
 	</update>
-	
-	
+
+
 	<!--物理删除-->
 	<update id="delete">
 		DELETE FROM work_invoice
 		WHERE id = #{id}
 	</update>
-	
+
 	<!--逻辑删除-->
 	<update id="deleteByLogic">
-		UPDATE work_invoice SET 
+		UPDATE work_invoice SET
 			del_flag = #{DEL_FLAG_DELETE}
 		WHERE id = #{id}
 	</update>
@@ -479,15 +479,15 @@
 			receipt_money = 1
 		WHERE id = #{id}
 	</update>
-	
-	
+
+
 	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
 	<select id="findUniqueByProperty" resultType="WorkInvoice" statementType="STATEMENT">
 		select * FROM work_invoice  where ${propertyName} = '${value}'
 	</select>
-	
+
 	<select id="findListByclient" resultType="WorkClientInfo">
-		SELECT 
+		SELECT
 			*
 		FROM work_client_info a
 		<where>
@@ -605,4 +605,33 @@
 			</otherwise>
 		</choose>
 	</select>
-</mapper>
+
+	<delete id="deleteProjectRelation">
+		delete from
+		  work_invoice_project_relation
+		where invoice_id = #{invoiceId}
+	</delete>
+
+	<insert id="insertProjectRelation">
+		insert into work_invoice_project_relation
+		(invoice_id, project_id)
+		values
+		  (#{invoiceId}, #{projectId})
+	</insert>
+	<select id="getProjectRelation" resultType="com.jeeplus.modules.workinvoice.entity.WorkInvoiceProjectRelation">
+		select
+		  a.invoice_id as 'invoiceId',
+		  a.project_id as 'projectId',
+		  rpr.project_name as 'projectName',
+		  rpr.project_id as 'projectNum',
+		  wci.name as 'workContractName',
+		  prd.number as 'projectNum',
+		  wct.name as 'clientName'
+		from work_invoice_project_relation a
+		left join rural_project_records rpr on a.project_id = rpr.id
+		left join work_contract_info wci on rpr.contract_id = wci.id
+		left join work_client_info wct on wci.client_id = wct.id
+		left join project_report_data prd on prd.project_id = a.project_id
+		where invoice_id = #{invoiceId}
+	</select>
+</mapper>