diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SelfStationController.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SelfStationController.java
index bece1cfc..88591869 100644
--- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SelfStationController.java
+++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SelfStationController.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.entity.vo.ChangeData;
+import org.jeecg.modules.entity.vo.FittingBody;
 import org.jeecg.modules.service.ISelfStationService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -176,4 +177,12 @@ public class SelfStationController {
         return selfStationService.Reprocessing(fileName, processKey, request);
     }
 
+
+    @PostMapping("fitting")
+    @ApiOperation(value = "公式计算新的曲线", notes = "公式计算新的曲线")
+    public Result fitting(@RequestBody FittingBody fittingBody, HttpServletRequest request) {
+        return selfStationService.fitting(fittingBody.getParamA(), fittingBody.getParamB(), fittingBody.getParamC(), fittingBody.getTempPoints(), fittingBody.getCount(), fittingBody.getSampleFileName(), fittingBody.getTabName(), fittingBody.isFittingBtn(), request);
+    }
+
+
 }
diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java
index 696fd9aa..9f28d12a 100644
--- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java
+++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java
@@ -2,6 +2,7 @@ package org.jeecg.modules.service;
 
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.entity.vo.ParameterInfo;
+import org.jeecg.modules.entity.vo.SeriseData;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -62,4 +63,8 @@ public interface ISelfStationService {
     Result viewBetaDetectorCalibration(Integer sampleId, String sampleFileName, String qcFileName, boolean fittingBtn, HttpServletRequest request);
 
     Result Reprocessing(String fileName, String processKey, HttpServletRequest request);
+
+    Result fitting(Double paramA, Double paramB, Double paramC, List<SeriseData> tempPointsArray, Integer count,
+                   String sampleFileName, String tabName, boolean fittingBtn, HttpServletRequest request);
+
 }
diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java
index 1562e811..b57101ae 100644
--- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java
+++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java
@@ -1734,6 +1734,198 @@ public class SelfStationServiceImpl implements ISelfStationService {
         return result;
     }
 
+    @Override
+    public Result fitting(Double paramA, Double paramB, Double paramC, List<SeriseData> tempPoints, Integer count,
+                          String sampleFileName, String tabName, boolean fittingBtn, HttpServletRequest request) {
+        Result result = new Result();
+        //获取用户名
+        String userName = JwtUtil.getUserNameByToken(request);
+        //获取自建台站缓存信息
+        Cache<String, SelfStationData> selfCache = selfStationCache.getSelfCache();
+        SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName);
+//        Cache<String, BetaDataFile> cache = betaCache.getBetaCache();
+//        BetaDataFile selfStationData = cache.getIfPresent(sampleFileName + "-" + userName);
+        if (Objects.isNull(selfStationData)) {
+            result.error500("Load basic file information first!");
+            return result;
+        }
+        Map<String, Object> map = new HashMap<>();
+        //记录点位的x轴数据
+        List<Double> xs = new LinkedList<>();
+        //记录点位的y轴数据
+        List<Double> ys = new LinkedList<>();
+        //接收算法计算得到的公式的数据
+        List<Double> fittingPara = new LinkedList<>();
+        //记录计算结果转换为字符串后数据的数组 第一组公式
+        List<String> fittingParaStr = new LinkedList<>();
+        //记录点位道值的数组
+        List<Double> channels = new LinkedList<>();
+        //新计算的点位数组
+        List<SeriseData> seriseDataList = new LinkedList<>();
+        //页面展示的表单数据数组
+        List<TableWidget> tableWidgets = new LinkedList<>();
+        //新计算得到的线点位数组
+        List<SeriseData> newLineSeries = new LinkedList<>();
+        //计算得到的新能量数组
+        List<List<Double>> energyList = new LinkedList<>();
+        //记录计算结果转换成字符串后数据的数组 第二组公式
+        List<String> fittingParaToUiStr = new LinkedList<>();
+        //tempPoint数组大小需要大于2个值
+        if ((CollectionUtils.isNotEmpty(tempPoints) && tempPoints.size() > 2 && Objects.nonNull(count) && tempPoints.size() != count)
+                || (Objects.isNull(paramA) || StringUtils.isBlank(String.valueOf(paramA)))
+                || (Objects.isNull(paramB) || StringUtils.isBlank(String.valueOf(paramB)))
+                || (Objects.isNull(paramC) || StringUtils.isBlank(String.valueOf(paramC))) ){
+            //遍历临时点数组 将点位的横坐标以及纵坐标封装到对应的数组
+            for (int i=0; i<tempPoints.size(); i++){
+                xs.add(tempPoints.get(i).getX());
+                ys.add(tempPoints.get(i).getY());
+            }
+            //C to E
+            fittingPara = EnergySpectrumHandler.GetFileFittingPara(xs, ys);
+            for (Double para:fittingPara) {
+                fittingParaStr.add(String.valueOf(para));
+            }
+            map.put("CToE", fittingParaStr);
+            //填充道值数组的数据
+            for (int i=0; i<255; i++) {
+                channels.add(Double.valueOf(i));
+            }
+            //计算道值的能量
+            List<Double> energys = EnergySpectrumHandler.GetFileFittingData(channels,fittingPara);
+            //如果当前fitting按钮没有进行过操作  并且  操作的是gamma探测器相关的
+            if (tabName.equalsIgnoreCase("gamma") && !fittingBtn) {
+                //根据临时点的道值修改对应能量值
+                //遍历所有道值
+                for (int i=0; i< channels.size(); i++) {
+                    //获取道值
+                    double channel = channels.get(i).doubleValue();
+                    //遍历临时点数据
+                    for (int j=0; j<tempPoints.size(); j++) {
+                        SeriseData seriseData = tempPoints.get(j);
+                        double tempChannel = seriseData.getX();
+                        //如果道值等于临时点的道值
+                        if (channel == tempChannel) {
+                            energys.set(i, seriseData.getY());
+                        }
+                    }
+                }
+            }
+            //将新计算的能量封装到数组
+            for (Double calEnergy:energys) {
+                List<Double> newEnergy = new LinkedList<>();
+                newEnergy.add(calEnergy);
+                energyList.add(newEnergy);
+            }
+            //遍历道值添加各道值对应点数据到数组
+            for (int i=0; i<channels.size(); ++i) {
+                SeriseData seriseData = new SeriseData();
+                seriseData.setX(channels.get(i));
+                seriseData.setY(energys.get(i));
+                newLineSeries.add(seriseData);
+            }
+            map.put("newLineSeries", newLineSeries);
+            //遍历点 缓存到表单数组以及折线图点位数组
+            for (int i=0; i<tempPoints.size(); i++) {
+                //表单数据信息
+                TableWidget tableWidget = new TableWidget();
+                tableWidget.setRowCount(i+1);
+                tableWidget.setChannel(tempPoints.get(i).getX());
+                tableWidget.setEnergy(tempPoints.get(i).getY());
+                tableWidgets.add(tableWidget);
+                //折线图位置信息
+                SeriseData seriseData = new SeriseData();
+                seriseData.setX(tempPoints.get(i).getX());
+                seriseData.setY(tempPoints.get(i).getY());
+                seriseDataList.add(seriseData);
+            }
+            map.put("tableWidgets", tableWidgets);
+            map.put("newScatterSeriesData", seriseDataList);
+            //E to C
+            List<Double> fittingParaToUi = EnergySpectrumHandler.GetFileFittingPara(ys, xs);
+            for (Double para:fittingParaToUi) {
+                fittingParaToUiStr.add(String.valueOf(para));
+            }
+            map.put("EToC", fittingParaToUiStr);
+        } else {
+            //添加公式的数据到公式一的数组
+            fittingPara.add(paramA);
+            fittingPara.add(paramB);
+            fittingPara.add(paramC);
+            //将公式各数据转换成字符串存到数组中
+            fittingParaStr.add(String.valueOf(paramA));
+            fittingParaStr.add(String.valueOf(paramB));
+            fittingParaStr.add(String.valueOf(paramC));
+            map.put("CToE", fittingParaStr);
+            //遍历点位数组 将横坐标的数据加入到数组中
+            for (int i=0; i<tempPoints.size(); i++){
+                xs.add(tempPoints.get(i).getX());
+            }
+            //根据公式和横坐标值 计算新的纵坐标数据
+            ys = EnergySpectrumHandler.GetFileFittingData(xs, fittingPara);
+            //遍历横坐标数值  将数据封存到表单数组以及折线图数组中
+            for (int i=0; i<xs.size(); i++) {
+                //表单数据信息
+                TableWidget tableWidget = new TableWidget();
+                tableWidget.setRowCount(i+1);
+                tableWidget.setChannel(xs.get(i));
+                tableWidget.setEnergy(ys.get(i));
+                tableWidgets.add(tableWidget);
+                //折线图位置信息
+                SeriseData seriseData = new SeriseData();
+                seriseData.setX(xs.get(i));
+                seriseData.setY(ys.get(i));
+                seriseDataList.add(seriseData);
+            }
+            map.put("tableWidgets", tableWidgets);
+            map.put("newScatterSeriesData", seriseDataList);
+            //填充道值数组的数据
+            for (int i=0; i<255; i++) {
+                channels.add(Double.valueOf(i));
+            }
+            //根据道值和公式参数计算新的能量数据
+            List<Double> energys = EnergySpectrumHandler.GetFileFittingData(channels,fittingPara);
+            for (Double calEnergy:energys) {
+                List<Double> newEnergy = new LinkedList<>();
+                newEnergy.add(calEnergy);
+                energyList.add(newEnergy);
+            }
+            //遍历道值 将道值和新的能量封装到新的点位数组
+            for (int i=0; i<channels.size(); ++i) {
+                SeriseData seriseData = new SeriseData();
+                seriseData.setX(channels.get(i));
+                seriseData.setY(energys.get(i));
+                newLineSeries.add(seriseData);
+            }
+            map.put("newLineSeries", newLineSeries);
+            //E to C
+            List<Double> fittingParaToUi = EnergySpectrumHandler.GetFileFittingPara(ys, xs);
+            for (Double para:fittingParaToUi) {
+                fittingParaToUiStr.add(String.valueOf(para));
+            }
+            map.put("EToC", fittingParaToUiStr);
+        }
+        if (tabName.equalsIgnoreCase("beta")) {
+            selfStationData.setBetaListNow(tempPoints);
+            selfStationData.setBetaFittingParaNow(fittingParaStr);
+            selfStationData.setBetaFittingParaToUiNow(fittingParaToUiStr);
+            selfStationData.setBetaNewEnergyListNow(energyList);
+        } else if (tabName.equalsIgnoreCase("gamma")) {
+            selfStationData.setGammaListNow(tempPoints);
+            selfStationData.setGammaFittingParaNow(fittingParaStr);
+            selfStationData.setGammaFittingParaToUiNow(fittingParaToUiStr);
+            selfStationData.setGammaNewEnergyListNow(energyList);
+            //gamma的进行计算后将当前的beta缓存的数据进行重置
+            selfStationData.setBetaListNow(Collections.EMPTY_LIST);
+            selfStationData.setBetaFittingParaNow(Collections.EMPTY_LIST);
+            selfStationData.setBetaFittingParaToUiNow(Collections.EMPTY_LIST);
+            selfStationData.setBetaNewEnergyListNow(Collections.EMPTY_LIST);
+        }
+        result.setSuccess(true);
+        result.setResult(map);
+        return result;
+    }
+
+
     private Map<String, Object> gammaAnalyse(PHDFile phd, Map<String, NuclideLines> nuclideLinesMap,
                                              Map<String, String> colorMap) throws RuntimeException{