1.按固定人员考勤、临时人员考勤区分

This commit is contained in:
lSun 2026-02-06 11:06:11 +08:00
parent daafe104f1
commit bc5800295f
15 changed files with 188 additions and 248 deletions

View File

@ -50,11 +50,11 @@ public class FaceContrastNewServiceImp implements FaceContrastNewService {
//把分公司下级全部查出来
List<FaceContrastNewBean> list = dao.getWorkAttendanceList(params, offset, limit);
//1115将临时考勤人员查出来
List<FaceContrastNewBean> list2 = dao.getWorkAttendanceTemporaryList(params, offset, limit);
// List<FaceContrastNewBean> list2 = dao.getWorkAttendanceTemporaryList(params, offset, limit);
//将临时人员加到总人数上
for (int i = 0; i < list.size(); i++) {
list.get(i).setAllPersonNum(list.get(i).getAllPersonNum() + list2.get(i).getAllPersonNum());
}
// for (int i = 0; i < list.size(); i++) {
// list.get(i).setAllPersonNum(list.get(i).getAllPersonNum() + list2.get(i).getAllPersonNum());
// }
//考勤数据较慢单独查
List<Integer> attList = dao.getWorkAttList(params, offset, limit);
for (int i = 0; i < attList.size(); i++) {

View File

@ -41,7 +41,7 @@
</if>
LEFT JOIN bm_sub_relation bsr on bsr.sub_contract_id = bsc.id and bsr.type = '3' and bsr.is_active = '1'
LEFT JOIN bm_team_user_relation btur ON btur.team_id = bsr.`value` and btur.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = btur.ID_NUMBER and bw.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = btur.ID_NUMBER and bw.is_active = '1' and worker_type = '1'
GROUP BY
pm.id
ORDER BY
@ -60,7 +60,11 @@
) pm
LEFT JOIN bm_project bp ON bp.project_general_id = pm.id
AND bp.is_active = '1'
LEFT JOIN ( SELECT id_number, pro_id FROM fc_face_contrast WHERE CURRENT_DAY = #{params.startTime} GROUP BY id_number, CURRENT_DAY ) ffc ON ffc.pro_id = bp.id
LEFT JOIN (
SELECT fc.id_number, fc.pro_id FROM fc_face_contrast fc
LEFT JOIN bm_worker bw on bw.id_number = fc.ID_NUMBER and bw.worker_type = '1'
WHERE fc.CURRENT_DAY = #{params.startTime} GROUP BY fc.id_number, fc.CURRENT_DAY
) ffc ON ffc.pro_id = bp.id
GROUP BY
pm.id
ORDER BY
@ -252,7 +256,7 @@
LEFT JOIN bm_team_user_relation btur ON btur.team_id = bsr.`value`
AND btur.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = btur.ID_NUMBER
AND bw.is_active = '1'
AND bw.is_active = '1' and bw.worker_type = '1'
<where>
<if test="params.proId != null and params.proId != '' ">
@ -295,7 +299,7 @@
</if>
LEFT JOIN bm_sub_team bst ON bst.id = bsr.`value`
LEFT JOIN bm_team_user_relation btur ON btur.team_id = bst.id and btur.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = btur.ID_NUMBER and bw.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = btur.ID_NUMBER and bw.is_active = '1' and bw.worker_type = '1'
WHERE
bp.id = #{params.proId} and bst.id is not null
<if test="params.teamName != null and params.teamName != '' ">
@ -474,7 +478,7 @@
bweh.is_active
FROM
bm_worker_ein_history bweh
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = bweh.ID_NUMBER
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = bweh.ID_NUMBER and bw.worker_type = '1'
<where>
bweh.project_id = #{params.proId}
<if test="params.teamId != null and params.teamId != '' ">
@ -570,11 +574,13 @@
and project_id = #{params.proId}
</if>
GROUP BY id_number)bweh ON bweh.project_id = bp.id
LEFT JOIN ( SELECT id_number, pro_id FROM fc_face_contrast WHERE CURRENT_DAY = #{params.startTime}
LEFT JOIN ( SELECT fc.id_number, fc.pro_id FROM fc_face_contrast fc
LEFT JOIN bm_worker bw on bw.id_number = fc.ID_NUMBER and bw.worker_type = '1'
WHERE fc.CURRENT_DAY = #{params.startTime}
<if test="params.proId != null and params.proId != '' ">
and pro_id = #{params.proId}
and fc.pro_id = #{params.proId}
</if>
GROUP BY id_number, CURRENT_DAY ) ffc ON ffc.pro_id = bp.id
GROUP BY fc.id_number, fc.CURRENT_DAY ) ffc ON ffc.pro_id = bp.id
<where>
<if test="params.proId != null and params.proId != '' ">
and bp.id = #{params.proId}
@ -727,7 +733,7 @@
) pm
LEFT JOIN bm_project bp ON bp.project_general_id = pm.id and bp.is_active = '1'
LEFT JOIN ( SELECT id_number, project_id FROM bm_worker_ein_history WHERE (sub_id is null or sub_id = 0)and is_active = '1' AND is_furlough_person = '0' AND exit_status != '1' GROUP BY id_number) bweh ON bweh.project_id = bp.id
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = bweh.ID_NUMBER and bw.is_active = '1'
LEFT JOIN bm_worker bw ON bw.ID_NUMBER = bweh.ID_NUMBER and bw.is_active = '1' and worker_type = '1'
GROUP BY
pm.id
ORDER BY

View File

@ -42,7 +42,7 @@
where `id_number` = #{idNumber};
INSERT INTO `bm_team_user_relation`
(`team_id`, `id_number`, is_regular_person, is_foreman, `IS_ACTIVE`)
VALUES (#{teamId}, #{idNumber}, #{isRegularPerson}, #{isForeman}, '1');
VALUES (#{teamId}, #{idNumber}, '0', '0', '1');
</insert>
<insert id="insertPersonContractData">
insert into bm_worker_contract

View File

@ -204,12 +204,12 @@ function init() {
var proName = row['proName'];
var html = '';
html += "<a style = 'color:#09A8F1;cursor: pointer' onclick = 'getAttendanceByTeam(\"" + teamId + "\",\"" + teamName + "\",\"" + subId + "\",\"" + subName + "\",\"" + proId + "\",\"" + proName + "\")'>" + NoNull(teamName) + "</a>";
if(NoNull(teamName) == "无班组人员"){
var str = '人员临时入场,还没有进入班组;' +
'进入班组后人员自动从无班组人员中去掉;' +
'无班组人员直接将出场无法通过工资册发工资。';
html += "<img onclick='explainClick(\"" + str + "\")' src='../../../../img/explain.png' title='查看注解' width='18' style='cursor: pointer;margin-left: 2px'>"
}
// if(NoNull(teamName) == "无班组人员"){
// var str = '人员临时入场,还没有进入班组;' +
// '进入班组后人员自动从无班组人员中去掉;' +
// '无班组人员直接将出场无法通过工资册发工资。';
// html += "<img onclick='explainClick(\"" + str + "\")' src='../../../../img/explain.png' title='查看注解' width='18' style='cursor: pointer;margin-left: 2px'>"
// }
return html;
},width: '25%'},
{"data": "allPersonNum",width: '10%'},

View File

@ -106,22 +106,6 @@ function init() {
}, "width": "5%"
},
{"data": "principal", "defaultContent": "", "width": "5%"},
{
"render": function (data, type, row) {
var id = row['id'];
var teamNumber = row['teamNumber'];
var html = "<span style='color: green;cursor: pointer;' title='' onclick='teamView(\"" + id + "\")'> " + teamNumber + " </span>";
return html;
}, "width": "5%"
},
/*{
"render": function (data, type, row) {
var id = row['id'];
var personNumber = row['personNumber'];
var html = "<span style='color: green;cursor: pointer;' title='' onclick='personView(\"" + id + "\")'> " + personNumber + " </span>";
return html;
}, "width": "5%"
},*/
{
"render": function (data, type, row) {
var id = row['id'];
@ -327,7 +311,7 @@ function buttonCompleteData(id, permission, pers) {
* 合同完工
* */
function completeView(id) {
let index = layer.confirm("确定完结该合同吗?<br/>合同完结会将班组移除,非固定人员移出班组并出场,请谨慎操作", function () {
let index = layer.confirm("确定完结该合同吗?<br/>合同完结会将班组移除,人员移出班组并出场,请谨慎操作", function () {
$.ajax({
type: 'post',
contentType: "application/x-www-form-urlencoded",

View File

@ -106,9 +106,9 @@ function init() {
},
{"data": "subName", "defaultContent": "","width":"5%"},
{"data": "teamName", "defaultContent": "","width":"4%"},
{"data": "foreman","orderable": false, "defaultContent": "","width":"4%"},
{"data": "foremanIdNumber","orderable": false, "defaultContent": "","width":"8%"},
{"data": "foremanPhone","orderable": false, "defaultContent": "","width":"9%"},
// {"data": "foreman","orderable": false, "defaultContent": "","width":"4%"},
// {"data": "foremanIdNumber","orderable": false, "defaultContent": "","width":"8%"},
// {"data": "foremanPhone","orderable": false, "defaultContent": "","width":"9%"},
{
"width":"7%",
"data": "",
@ -126,6 +126,8 @@ function init() {
if(idNumbers == '' || idNumbers == null || idNumbers == 'null' || idNumbers == undefined || idNumbers == 'undefined'){
html += buttonSwitchSub(id, "sys:teamBasic:update", pers);
}
html += buttonCheckData(id, "", pers);
return html;
}
},
@ -134,6 +136,39 @@ function init() {
});
}
function buttonCheckData(id, permission, pers) {
if (permission != "") {
if ($.inArray(permission, pers) < 0) {
return "";
}
}
var btn = $("<button class='layui-btn layui-btn-xs' title='详情' onclick='checkView(\"" + id + "\")'>人员详情</button>");
return btn.prop("outerHTML");
}
/**
* 查看
* */
function checkView(id) {
localStorage.setItem("teamId", id);
let width = "80%";
let height = "90%";
var index = layer.open({
title: ['班组成员查看', 'color:#3B70A1;background-color:#E8ECEB;font-size:20px'],
type: 2,
content: '../PersonSetting/TeamPersonList.html',
area: [width, height],
maxmin: false,
success: function (layero, index) {
},
yes: function (index, layero) {
}
});
}
/**
* 新增页面
* */

View File

@ -252,6 +252,56 @@
</div>
</div>
</div>
<!--分包班组信息-->
<div class="layui-colla-item" id="subTeamModule">
<div class="layui-colla-title">分包班组信息
<i class="tip-required" style="color: red;">(若没有分包、班组信息,请先签署分包合同)</i>
</div>
<div class="layui-colla-content layui-show">
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
<i class="tip-required"
style="color: red;font-size: 20px">*</i>所属分包
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="subId" name="subId" lay-filter="subId" lay-filter="subId"
lay-search lay-verify="required">
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
<i class="tip-required"
style="color: red;font-size: 20px">*</i>所属班组
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamId" name="teamId" lay-filter="teamId" lay-filter="teamId"
lay-search lay-verify="required">
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%;margin-top: 2%">
<label class="layui-form-label" style="width: 130px">
所属分包合同
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallContract" id="fallContract" class="layui-input"
>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属工程
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallPro" id="fallPro" class="layui-input">
</div>
</div>
</div>
</div>
<!--安全培训考试-->
<div class="layui-colla-item">
<div class="layui-colla-title">安全培训考试
@ -467,76 +517,7 @@
</div>
</div>
</div>
<!--分包班组信息-->
<div class="layui-colla-item" id="subTeamModule">
<div class="layui-colla-title">分包班组信息
<i class="tip-required" style="color: red;">(固定人员生成工资册之前必须完善)</i>
</div>
<div class="layui-colla-content layui-show">
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属分包
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="subId" name="subId" lay-filter="subId" lay-filter="subId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属班组
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamId" name="teamId" lay-filter="teamId" lay-filter="teamId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%;margin-top: 2%">
<label class="layui-form-label" style="width: 130px">
所属分包合同
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallContract" id="fallContract" class="layui-input"
>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属工程
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallPro" id="fallPro" class="layui-input">
</div>
</div>
<!--<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
是否为班组固定人员
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamRegularSwitch" name="teamRegularSwitch" lay-filter="teamRegularSwitch" lay-search>
<option value="1"></option>
<option value="0" selected></option>
</select>
</div>
</div>-->
<!--<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
是否为班组长
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="isForeman" name="isForeman" lay-filter="isForeman" lay-search>
<option value="1"></option>
<option value="0" selected></option>
</select>
</div>
</div>-->
</div>
</div>
<!--合同信息-->
<div class="layui-colla-item" id="contractModule">
<div class="layui-colla-title">合同信息

View File

@ -683,6 +683,9 @@ function keyContentRequired() {
var phone = $("#phone").val(); //手机号码
var proId = $("#proId").val(); //工程
var subId = $("#subId").val();
var teamId = $("#teamId").val();
var checkupDate = $("#checkupDate").val(); //体检日期
if (checkupDate === "" || checkupDate === "null" || checkupDate == null) {
layer.alert("未填写体检日期", { icon: 0 });
@ -702,28 +705,15 @@ function keyContentRequired() {
layer.alert("未选择工程", { icon: 0 });
$("#proId").focus();
return false;
} else if(subId === "" || subId === "null" || subId == null){
layer.alert("未选择所属分包", { icon: 0 });
$("#subId").focus();
return false;
} else if(teamId === "" || teamId === "null" || teamId == null){
layer.alert("未选择所属班组", { icon: 0 });
$("#teamId").focus();
return false;
}
// else{
// //verifyPersonPhone
// let state = true;
// $.ajax({
// type: 'post',
// url: ctxPath + '/personComprehensive/verifyPersonPhone',
// async: false,
// data: {
// phone: phone
// },
// success: function (data) {
// if(data.code != '200'){
// layer.alert(data.msg);
// state = false;
// }
// }
// });
// if(!state){
// return false;
// }
// }
return true;
}

View File

@ -227,6 +227,54 @@
</div>
</div>
</div>
<!--分包班组信息-->
<div class="layui-colla-item" id="subTeamModule">
<div class="layui-colla-title">分包班组信息
<i class="tip-required" style="color: red;">(固定人员生成工资册之前必须完善)</i>
</div>
<div class="layui-colla-content layui-show">
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属分包
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="subId" name="subId" lay-filter="subId" lay-filter="subId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属班组
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamId" name="teamId" lay-filter="teamId" lay-filter="teamId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%;margin-top: 2%">
<label class="layui-form-label" style="width: 130px">
所属分包合同
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallContract" id="fallContract" class="layui-input"
>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属工程
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallPro" id="fallPro" class="layui-input">
</div>
</div>
</div>
</div>
<!--安全培训考试-->
<div class="layui-colla-item">
<div class="layui-colla-title">安全培训考试
@ -442,76 +490,7 @@
</div>
</div>
</div>
<!--分包班组信息-->
<div class="layui-colla-item" id="subTeamModule">
<div class="layui-colla-title">分包班组信息
<i class="tip-required" style="color: red;">(固定人员生成工资册之前必须完善)</i>
</div>
<div class="layui-colla-content layui-show">
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属分包
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="subId" name="subId" lay-filter="subId" lay-filter="subId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属班组
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamId" name="teamId" lay-filter="teamId" lay-filter="teamId"
lay-search>
</select>
</div>
</div>
<div class="layui-input-inline" style="width: 60%;margin-top: 2%">
<label class="layui-form-label" style="width: 130px">
所属分包合同
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallContract" id="fallContract" class="layui-input"
>
</div>
</div>
<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
所属工程
</label>
<div class="layui-input-block" style="margin-left: 130px">
<input type="text" name="fallPro" id="fallPro" class="layui-input">
</div>
</div>
<!--<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
是否为班组固定人员
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="teamRegularSwitch" name="teamRegularSwitch" lay-filter="teamRegularSwitch" lay-search>
<option value="1"></option>
<option value="0" selected></option>
</select>
</div>
</div>-->
<!--<div class="layui-input-inline" style="width: 60%">
<label class="layui-form-label" style="width: 130px">
是否为班组长
</label>
<div class="layui-input-block" style="margin-left: 130px">
<select id="isForeman" name="isForeman" lay-filter="isForeman" lay-search>
<option value="1"></option>
<option value="0" selected></option>
</select>
</div>
</div>-->
</div>
</div>
<div class="layui-colla-item" id="electronicContractModule" style="display: none">
<div class="layui-colla-title">合同信息
<i class="tip-required" style="color: red;">(正式人员生成工资册之前必须完善)</i>

View File

@ -1942,14 +1942,14 @@ function setData(data) {
getTeamBySubId(data.subId, data.teamId); //班组、工程选择 所属班组
getTeamBySubIdToData(data.subId, data.teamId);
} else {
getProByTeamId(data.proProId, data.proTeamId);
getSubByProId(data.proProId, data.proSubId);
getTeamBySubId(data.proSubId, data.proTeamId); //班组、工程选择 所属班组
getProByTeamId(data.proId, "");
getSubByProId(data.proId, data.subId);
getTeamBySubId(data.subId, data.proTeamId); //班组、工程选择 所属班组
$("#proId").attr("disabled", "true");
$("#subId").attr("disabled", "true");
$("#teamId").attr("disabled", "true");
attendanceMachine = getAttendanceMachineByProId(data.proProId);
getTeamBySubIdToData(data.proSubId, data.proTeamId);
attendanceMachine = getAttendanceMachineByProId(data.proId);
getTeamBySubIdToData(data.subId, data.proTeamId);
}
subId = data.subId;
isFurloughPerson = data.isFurloughPerson;

View File

@ -76,19 +76,6 @@
</div>
</div>
<div class="layui-inline" style="float: left;width: 50%;margin-top: 2%;margin-left: 20%" >
<label class="layui-form-label">班组及人员选择</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" onclick="selectTeam()" style="margin-top: 2%;" >班组及人员选择</button>
</div>
</div>
<div class="layui-inline" style="float: left;width: 50%;margin-top: 2%;margin-left: 20%" >
<div style="width: 99%;float: right;overflow:auto">
<table id="teamTable" lay-filter="teamOperation"></table>
</div>
</div>
<div class="layui-form-item" style="display: none">
<div class="layui-input-block">
<button type="button" class="layui-btn" id="commit" lay-submit lay-filter="formDemo">提交</button>

View File

@ -54,8 +54,6 @@
<th>工程名称</th>
<th>合同金额(元)</th>
<th>现场负责人</th>
<th>备案班组</th>
<!-- <th>备案人员</th>-->
<th>附件</th>
<th>操作</th>
</tr>

View File

@ -34,9 +34,9 @@
<button class="layui-btn layui-btn-sm" permission="sys:teamBasic:add" onclick="add()">
<i class="layui-icon">&#xe608;</i> 新增
</button>
<button class="layui-btn layui-btn-sm"
<!--<button class="layui-btn layui-btn-sm"
onclick="team()" style="">班组人员批量配置
</button>
</button>-->
<span style="color: #E02232;float: right;margin-top: 2%;">*如要更换分包商需将班组中的人员全部出场</span>
</div>
</form>
@ -60,9 +60,9 @@
<th>工程名称</th>
<th>分包商名称</th>
<th>班组名称</th>
<th>班组长</th>
<th>班组长身份证</th>
<th>班组长联系方式</th>
<!-- <th>班组长</th>-->
<!-- <th>班组长身份证</th>-->
<!-- <th>班组长联系方式</th>-->
<th>操作</th>
</tr>
</thead>

View File

@ -33,11 +33,10 @@
</select>
<select id="getSubByProId" resultType="com.bonus.system.api.domain.SelectBean">
SELECT distinct bs.id,bs.sub_name as name FROM `bm_subcontractor` bs
left join bm_sub_contract bsc on bsc.sub_id = bs.id and bsc.is_active = 1
left join bm_sub_relation bsr on bsr.sub_contract_id = bsc.id and bsr.is_active = 1
left join bm_project bp on bp.id = bsc.pro_id and bp.is_active = 1
where bs.is_active = '1' and bp.id = #{proId} and bsr.type = 3
SELECT distinct bs.id,bs.sub_name as name FROM bm_project bp
LEFT JOIN bm_sub_contract bsc on bp.id = bsc.pro_id AND bsc.is_active = '1'
LEFT JOIN bm_subcontractor bs on bsc.sub_id = bs.id and bs.is_active = '1'
where bp.id = #{proId}
group by bs.id
</select>

19
pom.xml
View File

@ -346,25 +346,6 @@
</resources>
</build>
<profiles>
<profile>
<id>lSun</id>
<properties>
<profiles.active>lp_smz_dev</profiles.active>
<nacos.server>127.0.0.1:8848</nacos.server>
<name.space>lp_smz_dev</name.space>
<username>nacos</username>
<password>nacos</password>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 可以添加更多环境配置 -->
</profiles>
<repositories>
<repository>
<id>public</id>