包头bug修复

This commit is contained in:
guoshengxiong 2025-02-14 19:10:20 +08:00
parent 1287e0654a
commit f4948136a0
16 changed files with 151 additions and 43 deletions

View File

@ -171,8 +171,8 @@ public class ConstructionSiteConsumptionRecordController {
ConstructionSiteConsumptionRecord record = constructionSiteConsumptionRecordService.queryById(id);
Map<Long, SystemUser> userMap = systemUserService.list(new LambdaQueryWrapper<SystemUser>()
.eq(SystemUser::getSn, record.getProjectSn())).stream().collect(Collectors.toMap(SystemUser::getUserId, Function.identity()));
map.put("dateBegin", record.getDateBegin());
map.put("dateEnd", record.getDateEnd());
map.put("dateBegin", DateUtil.format(record.getDateBegin(), "yyyy年MM月dd日"));
map.put("dateEnd", DateUtil.format(record.getDateEnd(), "yyyy年MM月dd日"));
map.put("contractor", record.getContractor());
map.put("recorder", record.getRecorder());
map.put("settlementCategory", record.getSettlementCategory());

View File

@ -65,10 +65,11 @@ public class PipelineWelderController {
@OperLog(operModul = "管道焊工管理", operType = "分页查询", operDesc = "分页列表查询管道焊工信息")
@ApiOperation(value = "分页列表查询管道焊工信息", notes = "分页列表查询管道焊工信息", httpMethod="GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "weldingPassRateDesc", value = "1焊接合格率降序", paramType = "query", required = false, dataType = "Integer"),
})
@ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "weldingPassRateDesc", value = "1焊接合格率降序", paramType = "query", required = false, dataType = "Integer"),
@ApiImplicitParam(name = "ignoreWelderNameNull", value = "1忽略焊工名称为null和无焊工记录的", paramType = "query", required = false, dataType = "Integer"),
})
@GetMapping(value = "/page")
public Result<IPage<PipelineWelder>> queryPageList(@ApiIgnore @RequestParam HashMap<String, Object> param) {
return Result.success(pipelineWelderService.queryPageList(param));

View File

@ -166,7 +166,9 @@ public class WorkerAdmissionDetailController {
@ApiOperation(value = "批量录入人员到实名制中", notes = "批量录入人员到实名制中", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name = "idCards", value = "人员身份证s", paramType = "body", required = true, dataType = "String"),
@ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String")
@ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"),
@ApiImplicitParam(name = "detailIds", value = "人员入场明细ids", paramType = "body", required = false, dataType = "String"),
@ApiImplicitParam(name = "addBy", value = "1人员身份证s默认2人员入场明细ids", paramType = "body", required = false, dataType = "String"),
})
@PostMapping(value = "/importWorkerBatch")
public Result importWorkerBatch(@RequestBody HashMap<String, Object> param) {

View File

@ -173,11 +173,13 @@ public class WorkerAdmissionDetail implements Serializable {
@ApiModelProperty(value = "更新时间")
private java.util.Date updateDate;
@Excel(name = "联系电话", width = 15)
@ApiModelProperty(value="联系电话")
private java.lang.String phone ;
@ApiModelProperty(value = "联系电话")
private java.lang.String phone;
@Excel(name = "资质是否合格0不合格1合格", width = 15)
@ApiModelProperty(value="资质是否合格0不合格1合格")
private java.lang.Integer isCertificateQualified ;
@ApiModelProperty(value = "资质是否合格0不合格1合格")
private java.lang.Integer isCertificateQualified;
@ApiModelProperty(value = "1已经录入0未录入")
private Integer isImport;
@TableField(exist = false)
private String random;
@ -203,11 +205,12 @@ public class WorkerAdmissionDetail implements Serializable {
@TableField(exist = false)
@ApiModelProperty(value = "开始考试时间")
private Date startExamTime;
@TableField(exist = false)
@ApiModelProperty(value = "1已经录入0未录入")
private Integer isImport;
@TableField(exist = false)
@ApiModelProperty(value = "考试记录id")
private Long recordId;
@TableField(exist = false)
@ApiModelProperty(value = "办证人")
private java.lang.Long certificateIssuingPerson;
}

View File

@ -17,12 +17,17 @@
left join enterprise_info ei on ei.id=wi.enterprise_id
left join (select * from worker_certificate where project_sn = #{param.projectSn} and certificate_type = 71
group by worker_id) wc on wc.worker_id = t.worker_id
left join (select ifnull(round(ifnull(sum(if(testing_qualified=1,1,0)),0)/count(*)*100,2),0) as welding_pass_rate,pipeline_welder_id
from pipeline_welding_record where testing_qualified != -1
left join (select ifnull(round(ifnull(sum(if(testing_qualified=1,1,0)),0)/count(*)*100,2),0) as
welding_pass_rate,pipeline_welder_id
from pipeline_welding_record where testing_qualified != -1
<if test="param.projectSn != null and param.projectSn != ''">
and project_sn = #{param.projectSn}
</if>
group by pipeline_welder_id) pwr on t.id = pwr.pipeline_welder_id
where 1=1
<if test="param.ignoreWelderNameNull == '1'.toString()">
and wi.worker_name is not null and wi.worker_name != '' and pwr.welding_pass_rate != 0
</if>
)t
${ew.customSqlSegment}
</select>

View File

@ -22,10 +22,11 @@
t2.name as post_work_type_name,
tr.start_exam_time,
tr.is_pass,
tr.score,
if(wi.id is null,0,1) as is_import
tr.score
<!-- ,if(wi.id is null,0,1) as is_import-->
,tr.id as record_id
,tr.is_new_batch
,wa.certificate_issuing_person
from worker_admission_detail t
left join worker_admission wa on wa.id=t.worker_admission_id
left join enterprise_info ei1 on ei1.id=t.epc_cbs

View File

@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.jeecg.common.system.query.QueryGenerator;
import com.zhgd.xmgl.constant.Cts;
import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmission;
import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmissionCertificateDetail;
import com.zhgd.xmgl.modules.baotou.entity.WorkerAdmissionDetail;
@ -18,10 +19,14 @@ import com.zhgd.xmgl.modules.baotou.mapper.WorkerAdmissionDetailMapper;
import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionCertificateDetailService;
import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionDetailService;
import com.zhgd.xmgl.modules.baotou.service.IWorkerAdmissionService;
import com.zhgd.xmgl.modules.basicdata.entity.SystemUser;
import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl;
import com.zhgd.xmgl.modules.basicdata.service.impl.SystemUserServiceImpl;
import com.zhgd.xmgl.modules.exam.service.IExamTrainRecordService;
import com.zhgd.xmgl.modules.worker.entity.*;
import com.zhgd.xmgl.modules.worker.mapper.UfaceDevMapper;
import com.zhgd.xmgl.modules.worker.service.*;
import com.zhgd.xmgl.security.util.SecurityUtils;
import com.zhgd.xmgl.util.FlowUtil;
import com.zhgd.xmgl.util.MapBuilder;
import com.zhgd.xmgl.util.PageUtil;
@ -50,6 +55,12 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
@Lazy
@Autowired
IWorkerAdmissionCertificateDetailService workerAdmissionCertificateDetailService;
@Lazy
@Autowired
SystemUserServiceImpl systemUserService;
@Lazy
@Autowired
NoticeServiceImpl noticeService;
@Autowired
private WorkerAdmissionDetailMapper workerAdmissionDetailMapper;
@Autowired
@ -107,6 +118,10 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
if (StrUtil.isNotBlank(workerAdmissionIds)) {
queryWrapper.in(RefUtil.fieldNameUlc(WorkerAdmissionDetail::getWorkerAdmissionId), StrUtil.split(workerAdmissionIds, ","));
}
String detailIds = MapUtils.getString(param, "detailIds");
if (StrUtil.isNotBlank(detailIds)) {
queryWrapper.in(RefUtil.fieldNameUlc(WorkerAdmissionDetail::getId), StrUtil.split(detailIds, ","));
}
queryWrapper.orderByAsc(RefUtil.fieldNameUlc(WorkerAdmissionDetail::getId));
return queryWrapper;
}
@ -168,9 +183,6 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
String idCards = MapUtils.getString(param, "idCards");
String projectSn = MapUtils.getString(param, "projectSn");
String msg = "操作成功";
if (StrUtil.isBlank(idCards)) {
return "请选择人员";
}
String ufaceId = null;
List<UfaceDev> ufaceDevs = ufaceDevMapper.selectList(new LambdaQueryWrapper<UfaceDev>()
.eq(UfaceDev::getProjectSn, projectSn));
@ -180,15 +192,39 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
}
List<WorkerAdmission> admissionList = workerAdmissionService.list(new LambdaQueryWrapper<WorkerAdmission>()
.eq(WorkerAdmission::getProjectSn, projectSn));
List<WorkerAdmissionDetail> detailList = this.queryList(new MapBuilder<String, Object>()
.put("projectSn", projectSn)
.put("idCards", idCards)
.put("isCertificateQualified", 1)
.put("isPass", 1)
.build());
Integer addBy = MapUtils.getInteger(param, "addBy");
String detailIdStrs = MapUtils.getString(param, "detailIds");
List<WorkerAdmissionDetail> detailList;
if (addBy == null || Objects.equals(addBy, 1)) {
if (StrUtil.isBlank(idCards)) {
return "请选择人员";
}
detailList = this.queryList(new MapBuilder<String, Object>()
.put("projectSn", projectSn)
.put("idCards", idCards)
.put("isCertificateQualified", 1)
.put("isPass", 1)
.build());
} else {
if (StrUtil.isBlank(detailIdStrs)) {
return "请选择人员";
}
detailList = this.queryList(new MapBuilder<String, Object>()
.put("projectSn", projectSn)
.put("detailIds", detailIdStrs)
.put("isCertificateQualified", 1)
.put("isPass", 1)
.build());
}
if (CollUtil.isEmpty(detailList)) {
return msg;
}
List<String> readNums = detailList.stream().map(o -> o.getNum()).collect(Collectors.toList());
List<String> existNums = workerInfoService.list(new LambdaQueryWrapper<WorkerInfo>()
.in(WorkerInfo::getNum, readNums).eq(WorkerInfo::getProjectSn, projectSn).last(Cts.IGNORE_DATA_SCOPE_CONDITION)).stream().map(WorkerInfo::getNum).collect(Collectors.toList());
List<String> existIdCards = detailList.stream().map(o -> o.getIdCard()).collect(Collectors.toList());
List<String> existWorkerIdCards = workerInfoService.list(new LambdaQueryWrapper<WorkerInfo>()
.in(WorkerInfo::getIdCard, existIdCards).eq(WorkerInfo::getProjectSn, projectSn).last(Cts.IGNORE_DATA_SCOPE_CONDITION)).stream().map(WorkerInfo::getIdCard).collect(Collectors.toList());
ArrayList<WorkerType> addTypes = new ArrayList<>();
ArrayList<TeamInfo> addTeams = new ArrayList<>();
ArrayList<DepartmentInfo> addDepartments = new ArrayList<>();
@ -267,8 +303,35 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
addCertificates.add(certificate);
}
}
ArrayList<String> repeatStrs = new ArrayList<>();
ArrayList<String> existStrs = new ArrayList<>();
ArrayList<String> successStrs = new ArrayList<>();
List<Long> startUsers = detailList.stream().map(WorkerAdmissionDetail::getCertificateIssuingPerson).collect(Collectors.toList());
Map<Long, SystemUser> startUserMap = systemUserService.getProjectChildernSystemUserList(new MapBuilder<String, Object>()
.put("userIdList", startUsers)
.put("projectSn", projectSn)
.build()).stream().collect(Collectors.toMap(SystemUser::getUserId, Function.identity(), (o1, o2) -> o1));
for (WorkerAdmissionDetail detail : detailList) {
WorkerInfo workerInfo = mapWorkerInfo(detail, admissionList, ufaceId);
//发起人不需要校验是否存在人员管理
SystemUser startUser = startUserMap.get(detail.getCertificateIssuingPerson());
if (startUser == null || (!Objects.equals(startUser.getIdCard(), detail.getIdCard()) && !Objects.equals(startUser.getNum(), detail.getNum()))) {
if (existWorkerIdCards.stream().anyMatch(o1 -> Objects.equals(detail.getIdCard(), o1))) {
existStrs.add(detail.getWorkerName() + "[" + detail.getIdCard() + "]");
continue;
}
if (existNums.contains(detail.getNum())) {
repeatStrs.add(detail.getWorkerName() + "[" + detail.getNum() + "]");
continue;
}
} else {
workerInfo.setId(startUser.getWorkerId());
}
existWorkerIdCards.add(detail.getIdCard());
existNums.add(detail.getNum());
successStrs.add(detail.getWorkerName() + "[" + detail.getIdCard() + "]");
detail.setIsImport(1);
baseMapper.updateById(detail);
addWorkers.add(workerInfo);
}
//插入班组部门
@ -306,7 +369,11 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
} else if (Objects.equals(addWorker.getPersonType(), 2)) {
addWorker.setDepartmentId(existDepartmentInfos.stream().filter(o -> Objects.equals(o.getDepartmentName(), addWorker.getDepartmentName()) && Objects.equals(o.getEnterpriseId(), addWorker.getEnterpriseId())).findFirst().get().getId());
}
workerInfoService.saveWorkerInfo(addWorker);
if (addWorker.getId() == null) {
workerInfoService.saveWorkerInfo(addWorker);
} else {
workerInfoService.editWorkerInfo(addWorker);
}
List<WorkerCertificate> workerCertificates = addCertificates.stream().filter(o -> Objects.equals(o.getIdCard(), addWorker.getIdCard())).collect(Collectors.toList());
for (WorkerCertificate workerCertificate : workerCertificates) {
workerCertificate.setWorkerId(addWorker.getId());
@ -331,6 +398,31 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
log.warn("保存人员异常:", e);
}
}
msg = "录入人员成功";
if (CollUtil.isNotEmpty(successStrs)) {
msg += ",成功入场人员:" + StrUtil.join("", successStrs);
}
if (CollUtil.isNotEmpty(existStrs)) {
msg += ",身份证已存在人员:" + StrUtil.join("", existStrs);
}
if (CollUtil.isNotEmpty(repeatStrs)) {
msg += ",编号已存在人员:" + StrUtil.join("", repeatStrs);
}
Long userId = SecurityUtils.getUser().getUserId();
List<SystemUser> systemUsers = systemUserService.getSystemUsersBySn(new MapBuilder<String, Object>().put(Cts.SN, projectSn).put(Cts.QUERY_TYPE, Cts.PROJECT_LEVEL).build());
List<Long> noticeUserIdList = systemUsers.stream().map(SystemUser::getUserId).collect(Collectors.toList());
if (!noticeUserIdList.contains(userId)) {
noticeUserIdList.add(userId);
}
noticeService.addUsersNotice(noticeUserIdList, "人员录入通知", msg, "10");
// if (CollUtil.isNotEmpty(existStrs)) {
// String m = "身份证已存在人员:" + StrUtil.join("", existStrs);
// noticeService.addUsersNotice(noticeUserIdList, "人员录入身份证已存在通知", m, "10");
// }
// if (CollUtil.isNotEmpty(repeatStrs)) {
// String m = "编号已存在人员:" + StrUtil.join("", repeatStrs);
// noticeService.addUsersNotice(noticeUserIdList, "人员录入编号已存在通知", m, "10");
// }
return msg;
}
@ -371,6 +463,8 @@ public class WorkerAdmissionDetailServiceImpl extends ServiceImpl<WorkerAdmissio
String postWorkTypeName = detail.getPostWorkTypeName();
Integer personType = detail.getPersonType();
WorkerInfo workerInfo = new WorkerInfo();
Long userId = SecurityUtils.getUser().getUserId();
workerInfo.setNoticeUserId(userId);
workerInfo.setWorkerName(workerName);
workerInfo.setFieldAcquisitionUrl(StrUtil.isNotBlank(fieldAcquisitionUrl) ? JSONArray.parseArray(fieldAcquisitionUrl).getJSONObject(0).getString("url") : null);
workerInfo.setIdCardDownPhotoUrl(StrUtil.isNotBlank(idCardDownPhotoUrl) ? JSONArray.parseArray(idCardDownPhotoUrl).getJSONObject(0).getString("url") : null);

View File

@ -63,6 +63,7 @@ public class WorkerAdmissionServiceImpl extends ServiceImpl<WorkerAdmissionMappe
@Lazy
@Autowired
IWorkerAdmissionDetailService workerAdmissionDetailService;
@Lazy
@Autowired
NoticeServiceImpl noticeService;
@Autowired

View File

@ -80,6 +80,12 @@
<if test="param.userId != null and param.userId != ''">
and t.user_id = #{param.userId}
</if>
<if test="param.userIdList != null and param.userIdList.size() > 0">
and t.user_id in
<foreach collection="param.userIdList" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="param.id != null and param.id != ''">
and t.user_id = #{param.id}
</if>

View File

@ -244,8 +244,8 @@ public class ExamWorkerController {
params.put("score", record.getScore());
params.put("startExamTime", DateUtil.format(record.getStartExamTime(), "yyyy年MM月dd日"));
// String tempUrl = Fileutils.getExportTemplateFile("template/下载试卷模板.docx").getAbsolutePath();
String tempUrl = "C:\\Users\\Administrator\\Desktop\\下载试卷模板.docx";
String tempUrl = Fileutils.getExportTemplateFile("template/下载试卷模板.docx").getAbsolutePath();
// String tempUrl = "C:\\Users\\Administrator\\Desktop\\下载试卷模板.docx";
//生成word文档流
EasyPoiUtil.exportNewLineWord(response, params, FileUtil.file(tempUrl));

View File

@ -203,9 +203,7 @@ public class ExamPaperServiceImpl extends ServiceImpl<ExamPaperMapper, ExamPaper
if (StringUtils.isNotBlank(questions)) {
List<Long> list = Arrays.asList(questions.split(",")).stream().map(Long::new).collect(Collectors.toList());
List<ExamQuestionBankVo> vos = examQuestionBankService.queryByBatchId(list);
if (Objects.equals(examPaper.getCheckQuestionType(), 2)) {
vos = vos.stream().sorted(Comparator.comparing(ExamQuestionBankVo::getType)).collect(Collectors.toList());
}
vos = vos.stream().sorted(Comparator.comparing(ExamQuestionBankVo::getType)).collect(Collectors.toList());
return vos;
}
}

View File

@ -482,9 +482,6 @@ public class ExamTrainRecordServiceImpl extends ServiceImpl<ExamTrainRecordMappe
if (StringUtils.isNotBlank(questions)) {
List<Long> list = Arrays.asList(questions.split(",")).stream().map(Long::new).collect(Collectors.toList());
List<ExamQuestionBankVo> vos = examQuestionBankService.queryByBatchId(list);
if (Objects.equals(examPaper.getCheckQuestionType(), 2)) {
vos = vos.stream().sorted(Comparator.comparing(ExamQuestionBankVo::getType)).collect(Collectors.toList());
}
//构造题目和选择答案map
String selectOptions = record.getSelectOptions();
@ -497,6 +494,7 @@ public class ExamTrainRecordServiceImpl extends ServiceImpl<ExamTrainRecordMappe
vos.forEach(o -> {
o.setSelectOption(questionIdMap.get(o.getId()));
});
vos = vos.stream().sorted(Comparator.comparing(ExamQuestionBankVo::getType)).collect(Collectors.toList());
return vos;
}
}

View File

@ -357,6 +357,10 @@ public class WorkerInfo implements Serializable {
private java.lang.Long epcCbs;
@ApiModelProperty(value = "包头部门")
private java.lang.String btDepartment;
/**
* 通知的人员id
*/
private Long noticeUserId;
@TableField(exist = false)
@ApiModelProperty(value = "人脸分数")
private java.lang.Integer faceScore;
@ -417,11 +421,6 @@ public class WorkerInfo implements Serializable {
@TableField(exist = false)
@ApiModelProperty(value = "动火证编号")
private String fireCertificate;
/**
* 通知的人员id
*/
@TableField(exist = false)
private Long noticeUserId;
@TableField(exist = false)
@ApiModelProperty(value = "岗位(工种)名称")
private java.lang.String postWorkTypeName;

View File

@ -453,12 +453,12 @@ public class FlowSeviceUtil {
if (Objects.equals(customStatus, 1)) {
instanceQuery.or().startedBy(userId + "").involvedUser(userId + "").endOr();
} else if (Objects.equals(customStatus, 2)) {
instanceQuery.or().processInstanceBusinessStatusLike("PRE%").endOr();
instanceQuery.or().startedBy(userId + "").involvedUser(userId + "").endOr();
}
Executor.builder()
//customStatus 1待催办2已办结3审批进行中4审批被撤销5审批被驳回
.ifTrueNext(Objects.equals(customStatus, 1), instanceQuery::unfinished)
.ifTrueNext(Objects.equals(customStatus, 3), instanceQuery::unfinished)
.ifNotBlankNext(Objects.equals(customStatus, 2) ? "PRE%" : null, instanceQuery::processInstanceBusinessStatusLike)
.ifNotBlankNext(Objects.equals(customStatus, 5) ? ProcessStatus.REFUSE.toString() : null, instanceQuery::processInstanceBusinessStatus);
instanceQuery.count();
return instanceQuery;

View File

@ -63,5 +63,5 @@ t.t6
负责人:{{constructionManagementDepartmentResponsiblePersonName}}{{constructionManagementDepartmentResponsiblePersonDate}}
年月日 - 4月15日
{{dateBegin}} - {{dateEnd}}

View File

@ -5,163 +5,3 @@
{{t3}}
{{c3}}
{{c4}}
{{c4}}
5555555
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}
{{c4}}