From 6e575fdd218b10d169e51a1f693d55f6082dc158 Mon Sep 17 00:00:00 2001 From: wyt <414651037@qq.com> Date: Thu, 5 Feb 2026 14:17:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BE=8A=E8=88=8D=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=AE=8C=E5=96=84=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=8C=89=E7=85=A7=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E5=AF=BC=E5=87=BA=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SheepPedigreeController.java | 110 ++ .../module/base/domain/SheepPedigree.java | 996 ++++++++++++++++++ .../base/mapper/SheepPedigreeMapper.java | 70 ++ .../base/service/ISheepPedigreeService.java | 63 ++ .../impl/SheepPedigreeServiceImpl.java | 104 ++ .../base/util/SheepPedigreeExcelUtils.java | 511 +++++++++ .../mapper/base/SheepPedigreeMapper.xml | 391 +++++++ 7 files changed, 2245 insertions(+) create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepPedigreeController.java create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/domain/SheepPedigree.java create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/mapper/SheepPedigreeMapper.java create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/service/ISheepPedigreeService.java create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/service/impl/SheepPedigreeServiceImpl.java create mode 100644 zhyc-module/src/main/java/com/zhyc/module/base/util/SheepPedigreeExcelUtils.java create mode 100644 zhyc-module/src/main/resources/mapper/base/SheepPedigreeMapper.xml diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepPedigreeController.java b/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepPedigreeController.java new file mode 100644 index 0000000..7c655ad --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepPedigreeController.java @@ -0,0 +1,110 @@ +package com.zhyc.module.base.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.zhyc.module.base.util.SheepPedigreeExcelUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.zhyc.common.annotation.Log; +import com.zhyc.common.core.controller.BaseController; +import com.zhyc.common.core.domain.AjaxResult; +import com.zhyc.common.enums.BusinessType; +import com.zhyc.module.base.domain.SheepPedigree; +import com.zhyc.module.base.service.ISheepPedigreeService; +import com.zhyc.common.utils.poi.ExcelUtil; +import com.zhyc.common.core.page.TableDataInfo; + +/** + * VIEWController + * + * @author ruoyi + * @date 2026-02-04 + */ +@RestController +@RequestMapping("/system/pedigree") +public class SheepPedigreeController extends BaseController +{ + @Autowired + private ISheepPedigreeService sheepPedigreeService; + + + /** + * 查询VIEW列表 + */ + @PreAuthorize("@ss.hasPermi('system:pedigree:list')") + @GetMapping("/list") + public TableDataInfo list(SheepPedigree sheepPedigree) + { + startPage(); + List list = sheepPedigreeService.selectSheepPedigreeList(sheepPedigree); + return getDataTable(list); + } + + /** + * 导出VIEW列表 + */ + + // 在Controller/Service中注入工具类 + @Autowired + private SheepPedigreeExcelUtils sheepPedigreeExcelUtils; + @PreAuthorize("@ss.hasPermi('system:pedigree:export')") + @Log(title = "VIEW", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SheepPedigree sheepPedigree) throws Exception { + List dataList = sheepPedigreeService.selectSheepPedigreeList(sheepPedigree); + // 调用实例方法(而非静态方法) + sheepPedigreeExcelUtils.export(response, dataList); + } + + /** + * 获取VIEW详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:pedigree:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(sheepPedigreeService.selectSheepPedigreeById(id)); + } + + /** + * 新增VIEW + */ + @PreAuthorize("@ss.hasPermi('system:pedigree:add')") + @Log(title = "VIEW", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SheepPedigree sheepPedigree) + { + return toAjax(sheepPedigreeService.insertSheepPedigree(sheepPedigree)); + } + + /** + * 修改VIEW + */ + @PreAuthorize("@ss.hasPermi('system:pedigree:edit')") + @Log(title = "VIEW", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SheepPedigree sheepPedigree) + { + return toAjax(sheepPedigreeService.updateSheepPedigree(sheepPedigree)); + } + + /** + * 删除VIEW + */ + @PreAuthorize("@ss.hasPermi('system:pedigree:remove')") + @Log(title = "VIEW", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(sheepPedigreeService.deleteSheepPedigreeByIds(ids)); + } +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/domain/SheepPedigree.java b/zhyc-module/src/main/java/com/zhyc/module/base/domain/SheepPedigree.java new file mode 100644 index 0000000..6615df8 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/domain/SheepPedigree.java @@ -0,0 +1,996 @@ +package com.zhyc.module.base.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zhyc.common.annotation.Excel; +import com.zhyc.common.core.domain.BaseEntity; + +/** + * VIEW对象 sheep_pedigree + * + * @author ruoyi + * @date 2026-02-04 + */ +public class SheepPedigree extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String bsManageTags; + + /** 牧场id */ + @Excel(name = "牧场id") + private Long ranchId; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String drRanch; + + /** 羊舍id */ + @Excel(name = "羊舍id") + private Long sheepfoldId; + + /** 羊舍名称 */ + @Excel(name = "羊舍名称") + private String sheepfoldName; + + /** 电子耳号 */ + @Excel(name = "电子耳号") + private String electronicTags; + + /** 品种id */ + @Excel(name = "品种id") + private Long varietyId; + + /** 品种 */ + @Excel(name = "品种") + private String variety; + + /** 家系 */ + @Excel(name = "家系") + private String family; + + /** 羊只类型 */ + @Excel(name = "羊只类型") + private String name; + + /** 性别 */ + @Excel(name = "性别") + private Long gender; + + /** 出生日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "出生日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date birthday; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long dayAge; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long monthAge; + + /** 胎次 */ + @Excel(name = "胎次") + private Long parity; + + /** 出生体重 */ + @Excel(name = "出生体重") + private Long birthWeight; + + /** 断奶日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "断奶日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date weaningDate; + + /** 羊只状态 */ + @Excel(name = "羊只状态") + private Long statusId; + + /** 断奶体重 */ + @Excel(name = "断奶体重") + private Long weaningWeight; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long weaningDayAge; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private BigDecimal weaningDailyGain; + + /** 当前体重 */ + @Excel(name = "当前体重") + private Long currentWeight; + + /** 繁育状态id */ + @Excel(name = "繁育状态id") + private Long breedStatusId; + + /** 繁殖状态 */ + @Excel(name = "繁殖状态") + private String breed; + + /** 父号id */ + @Excel(name = "父号id") + private Long bsFatherId; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String fatherManageTags; + + /** 母号id */ + @Excel(name = "母号id") + private Long bsMotherId; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String motherManageTags; + + /** 受体id */ + @Excel(name = "受体id") + private Long receptorId; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String receptorManageTags; + + /** 父号id */ + @Excel(name = "父号id") + private Long fatherFatherId; + + /** 管理耳号 */ + @Excel(name = "祖父管理耳号") + private String grandfatherManageTags; + + /** 母号id */ + @Excel(name = "母号id") + private Long fatherMotherId; + + /** 管理耳号 */ + @Excel(name = "祖母管理耳号") + private String grandmotherManageTags; + + /** 父号id */ + @Excel(name = "父号id") + private Long fatherId; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String maternalGrandfatherManageTags; + + /** 母号id */ + @Excel(name = "母号id") + private Long motherId; + + /** 管理耳号 */ + @Excel(name = "管理耳号") + private String maternalGrandmotherManageTags; + + /** 配种日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "配种日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date matingDate; + + /** 配种类型 */ + @Excel(name = "配种类型") + private Long matingTypeId; + + /** 孕检日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "孕检日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date pregDate; + + /** 产羔日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "产羔日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date lambingDate; + + /** 产羔时怀孕天数 */ + @Excel(name = "产羔时怀孕天数") + private Long lambingDay; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long matingDay; + + /** 怀孕天数 */ + @Excel(name = "怀孕天数") + private Long gestationDay; + + /** 预产日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "预产日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date expectedDate; + + /** 产后天数 */ + @Excel(name = "产后天数") + private Long postLambingDay; + + /** 泌乳天数 */ + @Excel(name = "泌乳天数") + private Long lactationDay; + + /** 空怀天数 */ + @Excel(name = "空怀天数") + private Long anestrousDay; + + /** 配种次数 */ + @Excel(name = "配种次数") + private Long matingCounts; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long matingTotal; + + /** 累计流产次数 */ + @Excel(name = "累计流产次数") + private Long miscarriageCounts; + + /** 备注 */ + @Excel(name = "备注") + private String comment; + + /** 是否性控 */ + @Excel(name = "是否性控") + private Long controlled; + + /** 体况评分 */ + @Excel(name = "体况评分") + private Long body; + + /** 乳房评分 */ + @Excel(name = "乳房评分") + private Long breast; + + /** 入群来源 */ + @Excel(name = "入群来源") + private String source; + + /** 入群日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入群日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date sourceDate; + + /** 来源牧场id */ + @Excel(name = "来源牧场id") + private Long sourceRanchId; + + /** $column.columnComment */ + @Excel(name = "来源牧场", readConverterExp = "$column.readConverterExp()") + private String sourceRanch; + + /** 是否删除 */ + @Excel(name = "是否删除") + private Long isDelete; + + /** $column.columnComment */ + @Excel(name = "毛色", readConverterExp = "$column.readConverterExp()") + private String sheepColor; + + /** $column.columnComment */ + @Excel(name = "等级", readConverterExp = "$column.readConverterExp()") + private String groupName; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setBsManageTags(String bsManageTags) + { + this.bsManageTags = bsManageTags; + } + + public String getBsManageTags() + { + return bsManageTags; + } + + public void setRanchId(Long ranchId) + { + this.ranchId = ranchId; + } + + public Long getRanchId() + { + return ranchId; + } + + public void setDrRanch(String drRanch) + { + this.drRanch = drRanch; + } + + public String getDrRanch() + { + return drRanch; + } + + public void setSheepfoldId(Long sheepfoldId) + { + this.sheepfoldId = sheepfoldId; + } + + public Long getSheepfoldId() + { + return sheepfoldId; + } + + public void setSheepfoldName(String sheepfoldName) + { + this.sheepfoldName = sheepfoldName; + } + + public String getSheepfoldName() + { + return sheepfoldName; + } + + public void setElectronicTags(String electronicTags) + { + this.electronicTags = electronicTags; + } + + public String getElectronicTags() + { + return electronicTags; + } + + public void setVarietyId(Long varietyId) + { + this.varietyId = varietyId; + } + + public Long getVarietyId() + { + return varietyId; + } + + public void setVariety(String variety) + { + this.variety = variety; + } + + public String getVariety() + { + return variety; + } + + public void setFamily(String family) + { + this.family = family; + } + + public String getFamily() + { + return family; + } + + public void setName(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setGender(Long gender) + { + this.gender = gender; + } + + public Long getGender() + { + return gender; + } + + public void setBirthday(Date birthday) + { + this.birthday = birthday; + } + + public Date getBirthday() + { + return birthday; + } + + public void setDayAge(Long dayAge) + { + this.dayAge = dayAge; + } + + public Long getDayAge() + { + return dayAge; + } + + public void setMonthAge(Long monthAge) + { + this.monthAge = monthAge; + } + + public Long getMonthAge() + { + return monthAge; + } + + public void setParity(Long parity) + { + this.parity = parity; + } + + public Long getParity() + { + return parity; + } + + public void setBirthWeight(Long birthWeight) + { + this.birthWeight = birthWeight; + } + + public Long getBirthWeight() + { + return birthWeight; + } + + public void setWeaningDate(Date weaningDate) + { + this.weaningDate = weaningDate; + } + + public Date getWeaningDate() + { + return weaningDate; + } + + public void setStatusId(Long statusId) + { + this.statusId = statusId; + } + + public Long getStatusId() + { + return statusId; + } + + public void setWeaningWeight(Long weaningWeight) + { + this.weaningWeight = weaningWeight; + } + + public Long getWeaningWeight() + { + return weaningWeight; + } + + public void setWeaningDayAge(Long weaningDayAge) + { + this.weaningDayAge = weaningDayAge; + } + + public Long getWeaningDayAge() + { + return weaningDayAge; + } + + public void setWeaningDailyGain(BigDecimal weaningDailyGain) + { + this.weaningDailyGain = weaningDailyGain; + } + + public BigDecimal getWeaningDailyGain() + { + return weaningDailyGain; + } + + public void setCurrentWeight(Long currentWeight) + { + this.currentWeight = currentWeight; + } + + public Long getCurrentWeight() + { + return currentWeight; + } + + public void setBreedStatusId(Long breedStatusId) + { + this.breedStatusId = breedStatusId; + } + + public Long getBreedStatusId() + { + return breedStatusId; + } + + public void setBreed(String breed) + { + this.breed = breed; + } + + public String getBreed() + { + return breed; + } + + public void setBsFatherId(Long bsFatherId) + { + this.bsFatherId = bsFatherId; + } + + public Long getBsFatherId() + { + return bsFatherId; + } + + public void setFatherManageTags(String fatherManageTags) + { + this.fatherManageTags = fatherManageTags; + } + + public String getFatherManageTags() + { + return fatherManageTags; + } + + public void setBsMotherId(Long bsMotherId) + { + this.bsMotherId = bsMotherId; + } + + public Long getBsMotherId() + { + return bsMotherId; + } + + public void setMotherManageTags(String motherManageTags) + { + this.motherManageTags = motherManageTags; + } + + public String getMotherManageTags() + { + return motherManageTags; + } + + public void setReceptorId(Long receptorId) + { + this.receptorId = receptorId; + } + + public Long getReceptorId() + { + return receptorId; + } + + public void setReceptorManageTags(String receptorManageTags) + { + this.receptorManageTags = receptorManageTags; + } + + public String getReceptorManageTags() + { + return receptorManageTags; + } + + public void setFatherFatherId(Long fatherFatherId) + { + this.fatherFatherId = fatherFatherId; + } + + public Long getFatherFatherId() + { + return fatherFatherId; + } + + public void setGrandfatherManageTags(String grandfatherManageTags) + { + this.grandfatherManageTags = grandfatherManageTags; + } + + public String getGrandfatherManageTags() + { + return grandfatherManageTags; + } + + public void setFatherMotherId(Long fatherMotherId) + { + this.fatherMotherId = fatherMotherId; + } + + public Long getFatherMotherId() + { + return fatherMotherId; + } + + public void setGrandmotherManageTags(String grandmotherManageTags) + { + this.grandmotherManageTags = grandmotherManageTags; + } + + public String getGrandmotherManageTags() + { + return grandmotherManageTags; + } + + public void setFatherId(Long fatherId) + { + this.fatherId = fatherId; + } + + public Long getFatherId() + { + return fatherId; + } + + public void setMaternalGrandfatherManageTags(String maternalGrandfatherManageTags) + { + this.maternalGrandfatherManageTags = maternalGrandfatherManageTags; + } + + public String getMaternalGrandfatherManageTags() + { + return maternalGrandfatherManageTags; + } + + public void setMotherId(Long motherId) + { + this.motherId = motherId; + } + + public Long getMotherId() + { + return motherId; + } + + public void setMaternalGrandmotherManageTags(String maternalGrandmotherManageTags) + { + this.maternalGrandmotherManageTags = maternalGrandmotherManageTags; + } + + public String getMaternalGrandmotherManageTags() + { + return maternalGrandmotherManageTags; + } + + public void setMatingDate(Date matingDate) + { + this.matingDate = matingDate; + } + + public Date getMatingDate() + { + return matingDate; + } + + public void setMatingTypeId(Long matingTypeId) + { + this.matingTypeId = matingTypeId; + } + + public Long getMatingTypeId() + { + return matingTypeId; + } + + public void setPregDate(Date pregDate) + { + this.pregDate = pregDate; + } + + public Date getPregDate() + { + return pregDate; + } + + public void setLambingDate(Date lambingDate) + { + this.lambingDate = lambingDate; + } + + public Date getLambingDate() + { + return lambingDate; + } + + public void setLambingDay(Long lambingDay) + { + this.lambingDay = lambingDay; + } + + public Long getLambingDay() + { + return lambingDay; + } + + public void setMatingDay(Long matingDay) + { + this.matingDay = matingDay; + } + + public Long getMatingDay() + { + return matingDay; + } + + public void setGestationDay(Long gestationDay) + { + this.gestationDay = gestationDay; + } + + public Long getGestationDay() + { + return gestationDay; + } + + public void setExpectedDate(Date expectedDate) + { + this.expectedDate = expectedDate; + } + + public Date getExpectedDate() + { + return expectedDate; + } + + public void setPostLambingDay(Long postLambingDay) + { + this.postLambingDay = postLambingDay; + } + + public Long getPostLambingDay() + { + return postLambingDay; + } + + public void setLactationDay(Long lactationDay) + { + this.lactationDay = lactationDay; + } + + public Long getLactationDay() + { + return lactationDay; + } + + public void setAnestrousDay(Long anestrousDay) + { + this.anestrousDay = anestrousDay; + } + + public Long getAnestrousDay() + { + return anestrousDay; + } + + public void setMatingCounts(Long matingCounts) + { + this.matingCounts = matingCounts; + } + + public Long getMatingCounts() + { + return matingCounts; + } + + public void setMatingTotal(Long matingTotal) + { + this.matingTotal = matingTotal; + } + + public Long getMatingTotal() + { + return matingTotal; + } + + public void setMiscarriageCounts(Long miscarriageCounts) + { + this.miscarriageCounts = miscarriageCounts; + } + + public Long getMiscarriageCounts() + { + return miscarriageCounts; + } + + public void setComment(String comment) + { + this.comment = comment; + } + + public String getComment() + { + return comment; + } + + public void setControlled(Long controlled) + { + this.controlled = controlled; + } + + public Long getControlled() + { + return controlled; + } + + public void setBody(Long body) + { + this.body = body; + } + + public Long getBody() + { + return body; + } + + public void setBreast(Long breast) + { + this.breast = breast; + } + + public Long getBreast() + { + return breast; + } + + public void setSource(String source) + { + this.source = source; + } + + public String getSource() + { + return source; + } + + public void setSourceDate(Date sourceDate) + { + this.sourceDate = sourceDate; + } + + public Date getSourceDate() + { + return sourceDate; + } + + public void setSourceRanchId(Long sourceRanchId) + { + this.sourceRanchId = sourceRanchId; + } + + public Long getSourceRanchId() + { + return sourceRanchId; + } + + public void setSourceRanch(String sourceRanch) + { + this.sourceRanch = sourceRanch; + } + + public String getSourceRanch() + { + return sourceRanch; + } + + public void setIsDelete(Long isDelete) + { + this.isDelete = isDelete; + } + + public Long getIsDelete() + { + return isDelete; + } + + public void setSheepColor(String sheepColor) + { + this.sheepColor = sheepColor; + } + + public String getSheepColor() + { + return sheepColor; + } + + public void setGroupName(String groupName) + { + this.groupName = groupName; + } + + public String getGroupName() + { + return groupName; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("bsManageTags", getBsManageTags()) + .append("ranchId", getRanchId()) + .append("drRanch", getDrRanch()) + .append("sheepfoldId", getSheepfoldId()) + .append("sheepfoldName", getSheepfoldName()) + .append("electronicTags", getElectronicTags()) + .append("varietyId", getVarietyId()) + .append("variety", getVariety()) + .append("family", getFamily()) + .append("name", getName()) + .append("gender", getGender()) + .append("birthday", getBirthday()) + .append("dayAge", getDayAge()) + .append("monthAge", getMonthAge()) + .append("parity", getParity()) + .append("birthWeight", getBirthWeight()) + .append("weaningDate", getWeaningDate()) + .append("statusId", getStatusId()) + .append("weaningWeight", getWeaningWeight()) + .append("weaningDayAge", getWeaningDayAge()) + .append("weaningDailyGain", getWeaningDailyGain()) + .append("currentWeight", getCurrentWeight()) + .append("breedStatusId", getBreedStatusId()) + .append("breed", getBreed()) + .append("bsFatherId", getBsFatherId()) + .append("fatherManageTags", getFatherManageTags()) + .append("bsMotherId", getBsMotherId()) + .append("motherManageTags", getMotherManageTags()) + .append("receptorId", getReceptorId()) + .append("receptorManageTags", getReceptorManageTags()) + .append("fatherFatherId", getFatherFatherId()) + .append("grandfatherManageTags", getGrandfatherManageTags()) + .append("fatherMotherId", getFatherMotherId()) + .append("grandmotherManageTags", getGrandmotherManageTags()) + .append("fatherId", getFatherId()) + .append("maternalGrandfatherManageTags", getMaternalGrandfatherManageTags()) + .append("motherId", getMotherId()) + .append("maternalGrandmotherManageTags", getMaternalGrandmotherManageTags()) + .append("matingDate", getMatingDate()) + .append("matingTypeId", getMatingTypeId()) + .append("pregDate", getPregDate()) + .append("lambingDate", getLambingDate()) + .append("lambingDay", getLambingDay()) + .append("matingDay", getMatingDay()) + .append("gestationDay", getGestationDay()) + .append("expectedDate", getExpectedDate()) + .append("postLambingDay", getPostLambingDay()) + .append("lactationDay", getLactationDay()) + .append("anestrousDay", getAnestrousDay()) + .append("matingCounts", getMatingCounts()) + .append("matingTotal", getMatingTotal()) + .append("miscarriageCounts", getMiscarriageCounts()) + .append("comment", getComment()) + .append("controlled", getControlled()) + .append("body", getBody()) + .append("breast", getBreast()) + .append("source", getSource()) + .append("sourceDate", getSourceDate()) + .append("sourceRanchId", getSourceRanchId()) + .append("sourceRanch", getSourceRanch()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("isDelete", getIsDelete()) + .append("sheepColor", getSheepColor()) + .append("groupName", getGroupName()) + .toString(); + } +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/mapper/SheepPedigreeMapper.java b/zhyc-module/src/main/java/com/zhyc/module/base/mapper/SheepPedigreeMapper.java new file mode 100644 index 0000000..4abdf72 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/mapper/SheepPedigreeMapper.java @@ -0,0 +1,70 @@ +package com.zhyc.module.base.mapper; + +import java.util.List; +import com.zhyc.module.base.domain.SheepPedigree; +import org.apache.ibatis.annotations.Param; + +/** + * VIEWMapper接口 + * + * @author ruoyi + * @date 2026-02-04 + */ +public interface SheepPedigreeMapper +{ + /** + * 查询VIEW + * + * @param id VIEW主键 + * @return VIEW + */ + public SheepPedigree selectSheepPedigreeById(Long id); + + /** + * 查询VIEW列表 + * + * @param sheepPedigree VIEW + * @return VIEW集合 + */ + public List selectSheepPedigreeList(SheepPedigree sheepPedigree); + + /** + * 新增VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + public int insertSheepPedigree(SheepPedigree sheepPedigree); + + /** + * 修改VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + public int updateSheepPedigree(SheepPedigree sheepPedigree); + + /** + * 删除VIEW + * + * @param id VIEW主键 + * @return 结果 + */ + public int deleteSheepPedigreeById(Long id); + + /** + * 批量删除VIEW + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSheepPedigreeByIds(Long[] ids); + + + /** + * 根据int类型id查询繁育状态名称 + * @param id 主键id(int类型) + * @return 繁育状态名称(breed列的值) + */ + String selectBreedNameById(@Param("id") Long id); +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/service/ISheepPedigreeService.java b/zhyc-module/src/main/java/com/zhyc/module/base/service/ISheepPedigreeService.java new file mode 100644 index 0000000..47387b1 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/service/ISheepPedigreeService.java @@ -0,0 +1,63 @@ +package com.zhyc.module.base.service; + +import java.util.List; +import com.zhyc.module.base.domain.SheepPedigree; + +/** + * VIEWService接口 + * + * @author ruoyi + * @date 2026-02-04 + */ +public interface ISheepPedigreeService +{ + /** + * 查询VIEW + * + * @param id VIEW主键 + * @return VIEW + */ + public SheepPedigree selectSheepPedigreeById(Long id); + + /** + * 查询VIEW列表 + * + * @param sheepPedigree VIEW + * @return VIEW集合 + */ + public List selectSheepPedigreeList(SheepPedigree sheepPedigree); + + /** + * 新增VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + public int insertSheepPedigree(SheepPedigree sheepPedigree); + + /** + * 修改VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + public int updateSheepPedigree(SheepPedigree sheepPedigree); + + /** + * 批量删除VIEW + * + * @param ids 需要删除的VIEW主键集合 + * @return 结果 + */ + public int deleteSheepPedigreeByIds(Long[] ids); + + /** + * 删除VIEW信息 + * + * @param id VIEW主键 + * @return 结果 + */ + public int deleteSheepPedigreeById(Long id); + + public String getBreedNameById(Long id); +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/service/impl/SheepPedigreeServiceImpl.java b/zhyc-module/src/main/java/com/zhyc/module/base/service/impl/SheepPedigreeServiceImpl.java new file mode 100644 index 0000000..9b03073 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/service/impl/SheepPedigreeServiceImpl.java @@ -0,0 +1,104 @@ +package com.zhyc.module.base.service.impl; + +import java.util.List; +import com.zhyc.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zhyc.module.base.mapper.SheepPedigreeMapper; +import com.zhyc.module.base.domain.SheepPedigree; +import com.zhyc.module.base.service.ISheepPedigreeService; + +/** + * VIEWService业务层处理 + * + * @author ruoyi + * @date 2026-02-04 + */ +@Service +public class SheepPedigreeServiceImpl implements ISheepPedigreeService +{ + @Autowired + private SheepPedigreeMapper sheepPedigreeMapper; + + /** + * 查询VIEW + * + * @param id VIEW主键 + * @return VIEW + */ + @Override + public SheepPedigree selectSheepPedigreeById(Long id) + { + return sheepPedigreeMapper.selectSheepPedigreeById(id); + } + + /** + * 查询VIEW列表 + * + * @param sheepPedigree VIEW + * @return VIEW + */ + @Override + public List selectSheepPedigreeList(SheepPedigree sheepPedigree) + { + return sheepPedigreeMapper.selectSheepPedigreeList(sheepPedigree); + } + + /** + * 新增VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + @Override + public int insertSheepPedigree(SheepPedigree sheepPedigree) + { + sheepPedigree.setCreateTime(DateUtils.getNowDate()); + return sheepPedigreeMapper.insertSheepPedigree(sheepPedigree); + } + + /** + * 修改VIEW + * + * @param sheepPedigree VIEW + * @return 结果 + */ + @Override + public int updateSheepPedigree(SheepPedigree sheepPedigree) + { + sheepPedigree.setUpdateTime(DateUtils.getNowDate()); + return sheepPedigreeMapper.updateSheepPedigree(sheepPedigree); + } + + /** + * 批量删除VIEW + * + * @param ids 需要删除的VIEW主键 + * @return 结果 + */ + @Override + public int deleteSheepPedigreeByIds(Long[] ids) + { + return sheepPedigreeMapper.deleteSheepPedigreeByIds(ids); + } + + /** + * 删除VIEW信息 + * + * @param id VIEW主键 + * @return 结果 + */ + @Override + public int deleteSheepPedigreeById(Long id) + { + return sheepPedigreeMapper.deleteSheepPedigreeById(id); + } + + @Override + public String getBreedNameById(Long id) { + if (id == null) { // int类型id为空直接返回空 + return ""; + } + return sheepPedigreeMapper.selectBreedNameById(id); + } +} diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/util/SheepPedigreeExcelUtils.java b/zhyc-module/src/main/java/com/zhyc/module/base/util/SheepPedigreeExcelUtils.java new file mode 100644 index 0000000..bc148b7 --- /dev/null +++ b/zhyc-module/src/main/java/com/zhyc/module/base/util/SheepPedigreeExcelUtils.java @@ -0,0 +1,511 @@ +package com.zhyc.module.base.util; + +import com.zhyc.module.base.domain.SheepPedigree; +import com.zhyc.module.base.service.ISheepPedigreeService; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import javax.servlet.http.HttpServletResponse; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.zhyc.common.utils.DictUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 羊只系谱自定义Excel导出工具(适配羊只系谱表(2)样式) + */ +@Component +public class SheepPedigreeExcelUtils { + // 日期格式化 + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + // 注入Service接口 + @Autowired + private ISheepPedigreeService sheepPedigreeService; + + /** + * 导出指定bsManageTags的羊只系谱(符合羊只系谱表(2)样式) + */ + public void export(HttpServletResponse response, List dataList) throws Exception { + // 1. 创建Excel工作簿和工作表 + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("羊只系谱"); + // 设置列宽(6列,索引0-5) + sheet.setColumnWidth(0, 15 * 256); // 第1列 + sheet.setColumnWidth(1, 15 * 256); // 第2列 + sheet.setColumnWidth(2, 15 * 256); // 第3列 + sheet.setColumnWidth(3, 15 * 256); // 第4列 + sheet.setColumnWidth(4, 15 * 256); // 第5列 + sheet.setColumnWidth(5, 15 * 256); // 第6列 + + // 2. 定义样式(新增:通用边框样式,所有单元格都应用) + CellStyle titleStyle = createTitleStyle(workbook); + CellStyle blockTitleStyle = createBlockTitleStyle(workbook); + CellStyle contentStyle = createContentStyle(workbook); + CellStyle borderStyle = createBorderStyle(workbook); // 纯边框样式,用于空单元格 + + int rowNum = 0; + // 遍历数据 + for (SheepPedigree pedigree : dataList) { + // ========== 1. 大标题:羊只系谱 ========== + Row titleRow = sheet.createRow(rowNum++); + titleRow.setHeightInPoints(25); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellValue("羊只系谱"); + titleCell.setCellStyle(titleStyle); + // 给标题行所有列应用边框 + fillRowWithBorder(titleRow, 0, 5, borderStyle); + sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum-1, 0, 5)); + + // ========== 2. 基础信息区块 ========== + // 普通耳号 + Row earTagRow = sheet.createRow(rowNum++); + earTagRow.setHeightInPoints(20); + Cell earTagLabelCell = earTagRow.createCell(0); + earTagLabelCell.setCellValue("普通耳号"); + earTagLabelCell.setCellStyle(contentStyle); + + String earTagContent = pedigree.getBsManageTags() != null ? pedigree.getBsManageTags() : ""; + Cell earTagValueCell = earTagRow.createCell(1); + earTagValueCell.setCellValue(earTagContent); + earTagValueCell.setCellStyle(contentStyle); + + // 给当前行所有列填充边框 + fillRowWithBorder(earTagRow, 0, 5, borderStyle); + CellRangeAddress earTagMerge = new CellRangeAddress( + rowNum - 1, + rowNum - 1, + 1, + 5 + ); + sheet.addMergedRegion(earTagMerge); + + // 品种 + 类别 + Row varietyRow = sheet.createRow(rowNum++); + varietyRow.setHeightInPoints(20); + Cell varietyLabelCell = varietyRow.createCell(0); + varietyLabelCell.setCellValue("品种"); + varietyLabelCell.setCellStyle(contentStyle); + + String varietyContent = pedigree.getVariety() != null ? pedigree.getVariety() : ""; + Cell varietyValueCell = varietyRow.createCell(1); + varietyValueCell.setCellValue(varietyContent); + varietyValueCell.setCellStyle(contentStyle); + + Cell categoryLabelCell = varietyRow.createCell(2); + categoryLabelCell.setCellValue("类别"); + categoryLabelCell.setCellStyle(contentStyle); + + String categoryContent = pedigree.getName() != null ? pedigree.getName() : ""; + Cell categoryValueCell = varietyRow.createCell(3); + categoryValueCell.setCellValue(categoryContent); + categoryValueCell.setCellStyle(contentStyle); + + // 填充边框 + fillRowWithBorder(varietyRow, 0, 5, borderStyle); + CellRangeAddress categoryMerge = new CellRangeAddress( + rowNum - 1, + rowNum - 1, + 3, + 5 + ); + sheet.addMergedRegion(categoryMerge); + + // 性别 + 出生重量 + 出生日期 + Row genderRow = sheet.createRow(rowNum++); + genderRow.setHeightInPoints(20); + Cell genderLabelCell = genderRow.createCell(0); + genderLabelCell.setCellValue("性别"); + genderLabelCell.setCellStyle(contentStyle); + + Cell genderValueCell = genderRow.createCell(1); + genderValueCell.setCellValue(getGenderText(pedigree.getGender())); + genderValueCell.setCellStyle(contentStyle); + + Cell birthWeightLabelCell = genderRow.createCell(2); + birthWeightLabelCell.setCellValue("出生重量"); + birthWeightLabelCell.setCellStyle(contentStyle); + + Cell birthWeightValueCell = genderRow.createCell(3); + String birthWeightContent = pedigree.getBirthWeight() != null ? pedigree.getBirthWeight() + "kg" : ""; + birthWeightValueCell.setCellValue(birthWeightContent); + birthWeightValueCell.setCellStyle(contentStyle); + + Cell birthDateLabelCell = genderRow.createCell(4); + birthDateLabelCell.setCellValue("出生日期"); + birthDateLabelCell.setCellStyle(contentStyle); + + Cell birthDateValueCell = genderRow.createCell(5); + String birthDate = pedigree.getBirthday() != null ? DATE_FORMAT.format(pedigree.getBirthday()) : ""; + birthDateValueCell.setCellValue(birthDate); + birthDateValueCell.setCellStyle(contentStyle); + + // 填充边框 + fillRowWithBorder(genderRow, 0, 5, borderStyle); + + // 毛色 + 月龄 + 状态 + Row furColorRow = sheet.createRow(rowNum++); + furColorRow.setHeightInPoints(20); + Cell furColorLabelCell = furColorRow.createCell(0); + furColorLabelCell.setCellValue("毛色"); + furColorLabelCell.setCellStyle(contentStyle); + + Cell furColorValueCell = furColorRow.createCell(1); + String furColorContent = pedigree.getSheepColor() != null ? pedigree.getSheepColor() : ""; + furColorValueCell.setCellValue(furColorContent); + furColorValueCell.setCellStyle(contentStyle); + + Cell monthAgeLabelCell = furColorRow.createCell(2); + monthAgeLabelCell.setCellValue("月龄"); + monthAgeLabelCell.setCellStyle(contentStyle); + + Cell monthAgeValueCell = furColorRow.createCell(3); + String monthAgeContent = pedigree.getMonthAge() != null ? pedigree.getMonthAge() + "月" : ""; + monthAgeValueCell.setCellValue(monthAgeContent); + monthAgeValueCell.setCellStyle(contentStyle); + + Cell statusLabelCell = furColorRow.createCell(4); + statusLabelCell.setCellValue("状态"); + statusLabelCell.setCellStyle(contentStyle); + + Map statusDict = new HashMap<>(); + statusDict.put(1L, "在群"); + statusDict.put(2L, "不在群"); + statusDict.put(null, ""); + + Object statusId = pedigree.getStatusId(); + String statusContent = statusDict.getOrDefault(statusId, "未知状态"); + + Cell statusValueCell = furColorRow.createCell(5); + statusValueCell.setCellValue(statusContent); + statusValueCell.setCellStyle(contentStyle); + + // 填充边框 + fillRowWithBorder(furColorRow, 0, 5, borderStyle); + + // 繁育状态 + 来源 + Row breedStatusRow = sheet.createRow(rowNum++); + breedStatusRow.setHeightInPoints(20); + int currentRow = rowNum - 1; + + Cell breedStatusLabelCell = breedStatusRow.createCell(0); + breedStatusLabelCell.setCellValue("繁育状态"); + breedStatusLabelCell.setCellStyle(contentStyle); + + Cell breedStatusValueCell = breedStatusRow.createCell(1); + String breedStatusContent = ""; + try { + Object breedObj = pedigree.getBreed(); + if (breedObj != null) { + breedStatusContent = breedObj.toString().trim(); + } + if (breedStatusContent == null || breedStatusContent.isEmpty()) { + breedStatusContent = ""; + } + } catch (Exception e) { + breedStatusContent = ""; + } + breedStatusValueCell.setCellValue(breedStatusContent); + breedStatusValueCell.setCellStyle(contentStyle); + + Cell sourceLabelCell = breedStatusRow.createCell(2); + sourceLabelCell.setCellValue("来源"); + sourceLabelCell.setCellStyle(contentStyle); + + Cell sourceValueCell = breedStatusRow.createCell(3); + String sourceCode = pedigree.getSource() != null ? pedigree.getSource().toString() : ""; + String sourceContent = ""; + try { + sourceContent = DictUtils.getDictLabel("source", sourceCode, ""); + } catch (Exception e) { + sourceContent = ""; + System.err.println("来源字典映射失败:" + e.getMessage()); + } + sourceValueCell.setCellValue(sourceContent); + sourceValueCell.setCellStyle(contentStyle); + + // 填充边框 + fillRowWithBorder(breedStatusRow, 0, 5, borderStyle); + CellRangeAddress sourceMerge = new CellRangeAddress( + currentRow, + currentRow, + 3, + 5 + ); + sheet.addMergedRegion(sourceMerge); + + // 等级 + 家系 + Row levelRow = sheet.createRow(rowNum++); + levelRow.setHeightInPoints(20); + int currentLevelRow = rowNum - 1; + + Cell levelLabelCell = levelRow.createCell(0); + levelLabelCell.setCellValue("等级"); + levelLabelCell.setCellStyle(contentStyle); + + Cell levelValueCell = levelRow.createCell(1); + String levelContent = pedigree.getGroupName() != null ? pedigree.getGroupName() : ""; + levelValueCell.setCellValue(levelContent); + levelValueCell.setCellStyle(contentStyle); + + Cell familyLabelCell = levelRow.createCell(2); + familyLabelCell.setCellValue("家系"); + familyLabelCell.setCellStyle(contentStyle); + + Cell familyValueCell = levelRow.createCell(3); + String familyContent = pedigree.getFamily() != null ? pedigree.getFamily() : ""; + familyValueCell.setCellValue(familyContent); + familyValueCell.setCellStyle(contentStyle); + + // 填充边框 + fillRowWithBorder(levelRow, 0, 5, borderStyle); + CellRangeAddress familyMerge = new CellRangeAddress( + currentLevelRow, + currentLevelRow, + 3, + 5 + ); + sheet.addMergedRegion(familyMerge); + + // ========== 3. 系谱信息区块(最终修复版) ========== + Row pedigreeTitleRow = sheet.createRow(rowNum++); + pedigreeTitleRow.setHeightInPoints(25); // 区块标题行高 + Cell pedigreeTitleCell = pedigreeTitleRow.createCell(0); + pedigreeTitleCell.setCellValue("系谱信息"); + pedigreeTitleCell.setCellStyle(blockTitleStyle); + // 填充标题行边框 + fillRowWithBorder(pedigreeTitleRow, 0, 5, borderStyle); + sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum-1, 0, 5)); + + // 系谱区块起始行(此时rowNum是系谱内容第1行) + int pedigreeStartRow = rowNum; + int pedigreeTotalRows = 12; + // 统一设置系谱12行的行高+填充边框 + for (int i = 0; i < pedigreeTotalRows; i++) { + Row tempRow = sheet.createRow(pedigreeStartRow + i); + tempRow.setHeightInPoints(20); + // 给每行的0-5列都填充边框样式 + fillRowWithBorder(tempRow, 0, 5, borderStyle); + } + + // ========== 1. 羊只列:第1列合并12行 ========== + Row sheepRow = sheet.getRow(pedigreeStartRow); + Cell sheepCell = sheepRow.createCell(0); + String sheepValue = pedigree.getBsManageTags() != null && !pedigree.getBsManageTags().isEmpty() + ? "羊只:" + pedigree.getBsManageTags() + : "羊只:无"; + sheepCell.setCellValue(sheepValue); + sheepCell.setCellStyle(contentStyle); // 覆盖为内容样式(带边框+字体) + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow, + pedigreeStartRow + 11, + 0, + 0 + )); + + // ========== 2. 父耳号:第2-3列合并前6行 ========== + Row fatherRow = sheet.getRow(pedigreeStartRow); + Cell fatherCell = fatherRow.createCell(1); + String fatherValue = pedigree.getFatherManageTags() != null && !pedigree.getFatherManageTags().isEmpty() + ? "父耳号:" + pedigree.getFatherManageTags() + : "父耳号:无"; + fatherCell.setCellValue(fatherValue); + fatherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow, + pedigreeStartRow + 5, + 1, + 2 + )); + + // ========== 3. 母耳号:第2-3列合并后6行 ========== + Row motherRow = sheet.getRow(pedigreeStartRow + 6); + Cell motherCell = motherRow.createCell(1); + String motherValue = pedigree.getMotherManageTags() != null && !pedigree.getMotherManageTags().isEmpty() + ? "母耳号:" + pedigree.getMotherManageTags() + : "母耳号:无"; + motherCell.setCellValue(motherValue); + motherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow + 6, + pedigreeStartRow + 11, + 1, + 2 + )); + + // ========== 4. 祖父耳号:第4-6列合并1-3行 ========== + Row grandFatherRow = sheet.getRow(pedigreeStartRow); + Cell grandFatherCell = grandFatherRow.createCell(3); + String grandFatherValue = pedigree.getGrandfatherManageTags() != null && !pedigree.getGrandfatherManageTags().isEmpty() + ? "祖父耳号:" + pedigree.getGrandfatherManageTags() + : "祖父耳号:无"; + grandFatherCell.setCellValue(grandFatherValue); + grandFatherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow, + pedigreeStartRow + 2, + 3, + 5 + )); + + // ========== 5. 祖母耳号:第4-6列合并4-6行 ========== + Row grandMotherRow = sheet.getRow(pedigreeStartRow + 3); + Cell grandMotherCell = grandMotherRow.createCell(3); + String grandMotherValue = pedigree.getGrandmotherManageTags() != null && !pedigree.getGrandmotherManageTags().isEmpty() + ? "祖母耳号:" + pedigree.getGrandmotherManageTags() + : "祖母耳号:无"; + grandMotherCell.setCellValue(grandMotherValue); + grandMotherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow + 3, + pedigreeStartRow + 5, + 3, + 5 + )); + + // ========== 6. 外祖父耳号:第4-6列合并7-9行 ========== + Row maternalGrandFatherRow = sheet.getRow(pedigreeStartRow + 6); + Cell maternalGrandFatherCell = maternalGrandFatherRow.createCell(3); + String maternalGrandFatherValue = pedigree.getMaternalGrandfatherManageTags() != null && !pedigree.getMaternalGrandfatherManageTags().isEmpty() + ? "外祖父耳号:" + pedigree.getMaternalGrandfatherManageTags() + : "外祖父耳号:无"; + maternalGrandFatherCell.setCellValue(maternalGrandFatherValue); + maternalGrandFatherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow + 6, + pedigreeStartRow + 8, + 3, + 5 + )); + + // ========== 7. 外祖母耳号:第4-6列合并10-12行 ========== + Row maternalGrandMotherRow = sheet.getRow(pedigreeStartRow + 9); + Cell maternalGrandMotherCell = maternalGrandMotherRow.createCell(3); + String maternalGrandMotherValue = pedigree.getMaternalGrandmotherManageTags() != null && !pedigree.getMaternalGrandmotherManageTags().isEmpty() + ? "外祖母耳号:" + pedigree.getMaternalGrandmotherManageTags() + : "外祖母耳号:无"; + maternalGrandMotherCell.setCellValue(maternalGrandMotherValue); + maternalGrandMotherCell.setCellStyle(contentStyle); + sheet.addMergedRegion(new CellRangeAddress( + pedigreeStartRow + 9, + pedigreeStartRow + 11, + 3, + 5 + )); + + // 更新rowNum到系谱区块结束行+1 + rowNum = pedigreeStartRow + pedigreeTotalRows; + + } + + // ========== 4. 输出Excel ========== + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String fileName = URLEncoder.encode("羊只系谱_" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + + OutputStream os = response.getOutputStream(); + workbook.write(os); + os.flush(); + os.close(); + workbook.close(); + } + + // ========== 新增:填充整行边框的工具方法 ========== + private void fillRowWithBorder(Row row, int startCol, int endCol, CellStyle borderStyle) { + for (int col = startCol; col <= endCol; col++) { + Cell cell = row.getCell(col); + if (cell == null) { + cell = row.createCell(col); + } + // 仅当单元格无样式时设置边框样式(避免覆盖已有内容样式) + if (cell.getCellStyle() == null || cell.getCellStyle().getBorderTop() == BorderStyle.NONE) { + cell.setCellStyle(borderStyle); + } + } + } + + // ========== 样式定义 ========== + private static CellStyle createTitleStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setFontName("微软雅黑"); + font.setFontHeightInPoints((short) 16); + font.setBold(true); + style.setFont(font); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + // 标题样式带完整边框 + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + return style; + } + + private static CellStyle createBlockTitleStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setFontName("微软雅黑"); + font.setFontHeightInPoints((short) 14); + font.setBold(true); + style.setFont(font); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // 区块标题带完整边框 + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + return style; + } + + private static CellStyle createContentStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setFontName("微软雅黑"); + font.setFontHeightInPoints((short) 12); + style.setFont(font); + style.setAlignment(HorizontalAlignment.LEFT); + style.setVerticalAlignment(VerticalAlignment.CENTER); + // 内容样式带完整边框 + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + return style; + } + + // 新增:纯边框样式(用于空单元格) + private static CellStyle createBorderStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + // 仅设置边框,无字体/背景色(避免覆盖内容样式) + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + style.setAlignment(HorizontalAlignment.LEFT); + style.setVerticalAlignment(VerticalAlignment.CENTER); + return style; + } + + // 性别数字转文字 + private static String getGenderText(Long gender) { + if (gender == null) return ""; + switch (gender.intValue()) { + case 1: return "母"; + case 2: return "公"; + case 3: return "阉羊"; + case 4: return "兼性"; + default: return ""; + } + } +} \ No newline at end of file diff --git a/zhyc-module/src/main/resources/mapper/base/SheepPedigreeMapper.xml b/zhyc-module/src/main/resources/mapper/base/SheepPedigreeMapper.xml new file mode 100644 index 0000000..d49945d --- /dev/null +++ b/zhyc-module/src/main/resources/mapper/base/SheepPedigreeMapper.xml @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, bs_manage_tags, ranch_id, dr_ranch, sheepfold_id, sheepfold_name, electronic_tags, variety_id, variety, family, name, gender, birthday, day_age, month_age, parity, birth_weight, weaning_date, status_id, weaning_weight, weaning_day_age, weaning_daily_gain, current_weight, breed_status_id, breed, bs_father_id, father_manage_tags, bs_mother_id, mother_manage_tags, receptor_id, receptor_manage_tags, father_father_id, grandfather_manage_tags, father_mother_id, grandmother_manage_tags, father_id, maternal_grandfather_manage_tags, mother_id, maternal_grandmother_manage_tags, mating_date, mating_type_id, preg_date, lambing_date, lambing_day, mating_day, gestation_day, expected_date, post_lambing_day, lactation_day, anestrous_day, mating_counts, mating_total, miscarriage_counts, comment, controlled, body, breast, source, source_date, source_ranch_id, source_ranch, update_by, update_time, create_by, create_time, is_delete, sheep_color, group_name from sheep_pedigree + + + + + + + + insert into sheep_pedigree + + id, + bs_manage_tags, + ranch_id, + dr_ranch, + sheepfold_id, + sheepfold_name, + electronic_tags, + variety_id, + variety, + family, + name, + gender, + birthday, + day_age, + month_age, + parity, + birth_weight, + weaning_date, + status_id, + weaning_weight, + weaning_day_age, + weaning_daily_gain, + current_weight, + breed_status_id, + breed, + bs_father_id, + father_manage_tags, + bs_mother_id, + mother_manage_tags, + receptor_id, + receptor_manage_tags, + father_father_id, + grandfather_manage_tags, + father_mother_id, + grandmother_manage_tags, + father_id, + maternal_grandfather_manage_tags, + mother_id, + maternal_grandmother_manage_tags, + mating_date, + mating_type_id, + preg_date, + lambing_date, + lambing_day, + mating_day, + gestation_day, + expected_date, + post_lambing_day, + lactation_day, + anestrous_day, + mating_counts, + mating_total, + miscarriage_counts, + comment, + controlled, + body, + breast, + source, + source_date, + source_ranch_id, + source_ranch, + update_by, + update_time, + create_by, + create_time, + is_delete, + sheep_color, + group_name, + + + #{id}, + #{bsManageTags}, + #{ranchId}, + #{drRanch}, + #{sheepfoldId}, + #{sheepfoldName}, + #{electronicTags}, + #{varietyId}, + #{variety}, + #{family}, + #{name}, + #{gender}, + #{birthday}, + #{dayAge}, + #{monthAge}, + #{parity}, + #{birthWeight}, + #{weaningDate}, + #{statusId}, + #{weaningWeight}, + #{weaningDayAge}, + #{weaningDailyGain}, + #{currentWeight}, + #{breedStatusId}, + #{breed}, + #{bsFatherId}, + #{fatherManageTags}, + #{bsMotherId}, + #{motherManageTags}, + #{receptorId}, + #{receptorManageTags}, + #{fatherFatherId}, + #{grandfatherManageTags}, + #{fatherMotherId}, + #{grandmotherManageTags}, + #{fatherId}, + #{maternalGrandfatherManageTags}, + #{motherId}, + #{maternalGrandmotherManageTags}, + #{matingDate}, + #{matingTypeId}, + #{pregDate}, + #{lambingDate}, + #{lambingDay}, + #{matingDay}, + #{gestationDay}, + #{expectedDate}, + #{postLambingDay}, + #{lactationDay}, + #{anestrousDay}, + #{matingCounts}, + #{matingTotal}, + #{miscarriageCounts}, + #{comment}, + #{controlled}, + #{body}, + #{breast}, + #{source}, + #{sourceDate}, + #{sourceRanchId}, + #{sourceRanch}, + #{updateBy}, + #{updateTime}, + #{createBy}, + #{createTime}, + #{isDelete}, + #{sheepColor}, + #{groupName}, + + + + + update sheep_pedigree + + bs_manage_tags = #{bsManageTags}, + ranch_id = #{ranchId}, + dr_ranch = #{drRanch}, + sheepfold_id = #{sheepfoldId}, + sheepfold_name = #{sheepfoldName}, + electronic_tags = #{electronicTags}, + variety_id = #{varietyId}, + variety = #{variety}, + family = #{family}, + name = #{name}, + gender = #{gender}, + birthday = #{birthday}, + day_age = #{dayAge}, + month_age = #{monthAge}, + parity = #{parity}, + birth_weight = #{birthWeight}, + weaning_date = #{weaningDate}, + status_id = #{statusId}, + weaning_weight = #{weaningWeight}, + weaning_day_age = #{weaningDayAge}, + weaning_daily_gain = #{weaningDailyGain}, + current_weight = #{currentWeight}, + breed_status_id = #{breedStatusId}, + breed = #{breed}, + bs_father_id = #{bsFatherId}, + father_manage_tags = #{fatherManageTags}, + bs_mother_id = #{bsMotherId}, + mother_manage_tags = #{motherManageTags}, + receptor_id = #{receptorId}, + receptor_manage_tags = #{receptorManageTags}, + father_father_id = #{fatherFatherId}, + grandfather_manage_tags = #{grandfatherManageTags}, + father_mother_id = #{fatherMotherId}, + grandmother_manage_tags = #{grandmotherManageTags}, + father_id = #{fatherId}, + maternal_grandfather_manage_tags = #{maternalGrandfatherManageTags}, + mother_id = #{motherId}, + maternal_grandmother_manage_tags = #{maternalGrandmotherManageTags}, + mating_date = #{matingDate}, + mating_type_id = #{matingTypeId}, + preg_date = #{pregDate}, + lambing_date = #{lambingDate}, + lambing_day = #{lambingDay}, + mating_day = #{matingDay}, + gestation_day = #{gestationDay}, + expected_date = #{expectedDate}, + post_lambing_day = #{postLambingDay}, + lactation_day = #{lactationDay}, + anestrous_day = #{anestrousDay}, + mating_counts = #{matingCounts}, + mating_total = #{matingTotal}, + miscarriage_counts = #{miscarriageCounts}, + comment = #{comment}, + controlled = #{controlled}, + body = #{body}, + breast = #{breast}, + source = #{source}, + source_date = #{sourceDate}, + source_ranch_id = #{sourceRanchId}, + source_ranch = #{sourceRanch}, + update_by = #{updateBy}, + update_time = #{updateTime}, + create_by = #{createBy}, + create_time = #{createTime}, + is_delete = #{isDelete}, + sheep_color = #{sheepColor}, + group_name = #{groupName}, + + where id = #{id} + + + + delete from sheep_pedigree where id = #{id} + + + + delete from sheep_pedigree where id in + + #{id} + + + + + + \ No newline at end of file