Browse Source

Pull request #9815: REPORT-75093 运营产品化二期

Merge in DESIGN/design from ~LINK.ZHAO/design:feature/x to feature/x

* commit '6c7a399f7b397cbae995ec4a3aa1eda3108da6ab':
  REPORT-75093 运营产品化二期 1、修改默认资源
  REPORT-75093 运营产品化二期 1、代码中不能有网址
  REPORT-75093 运营产品化二期 1、根据设计器id进行动态过滤 2、模板资源下载修改 3、添加埋点
feature/x
Link.Zhao 2 years ago
parent
commit
3b3ca63e84
  1. 20
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java
  2. 2
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/action/StartUseAction.java
  3. 51
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java
  4. 16
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsList.java
  5. 49
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/ProductNews.java
  6. 8
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java
  7. 14
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java
  8. 29
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/helper/FineMarketClientHelper.java
  9. 68
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java
  10. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template1.png
  11. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template2.png
  12. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template3.png
  13. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template4.png
  14. 156
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/template_resource/local_templates.json

20
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java

@ -5,8 +5,9 @@ import com.fr.base.svg.IconUtils;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.general.CloudCenter; import com.fr.general.CloudCenter;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import javax.swing.Icon;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
@ -14,7 +15,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
import javax.swing.Icon;
/** /**
@ -154,9 +154,21 @@ public class AlphaFineConstants {
public static final String ALPHA_PREVIEW = CloudCenter.getInstance().acquireUrlByKind("af.preview"); public static final String ALPHA_PREVIEW = CloudCenter.getInstance().acquireUrlByKind("af.preview");
public static final String ALPHA_CID = CloudCenter.getInstance().acquireUrlByKind("af.cid", "https://cid.fanruan.com/api/nav/alphafine"); public static final String ALPHA_CID = CloudCenter.getInstance().acquireUrlByKind("af.cid");
public static final String ALPHA_CID_USER_GROUP_INFO = CloudCenter.getInstance().acquireUrlByKind("af.cid.user.group.info");
public static final String SEARCH_BY_ID = "?id=";
private static final String QUICK_START_URL = CloudCenter.getInstance().acquireUrlByKind("af.help.quick.start");
private static final String REPORT_LEARNING_PATH = CloudCenter.getInstance().acquireUrlByKind("af.help.report.learning.path");
private static final String PARAMETER_LEARNING_PATH = CloudCenter.getInstance().acquireUrlByKind("af.help.param.learning.path");
private static final String FILL_LEARNING_PATH = CloudCenter.getInstance().acquireUrlByKind("af.help.fill.learning.path");
private static final String API_SUMMARY = CloudCenter.getInstance().acquireUrlByKind("af.help.api.summary");
private static final String MONTHLY_DOCUMENT = CloudCenter.getInstance().acquireUrlByKind("af.help.monthly.document");
private static final String DEFAULT_RECOMMEND = "[ { \"name\":\"快速入门指南\", \"link\":\"https://help.fanruan.com/finereport/doc-view-1335.html?source=3\" }, { \"name\":\"报表应用学习路径\", \"link\":\"https://help.fanruan.com/finereport/doc-view-1336.html?source=3\" }, { \"name\":\"参数应用学习路径\", \"link\":\"https://help.fanruan.com/finereport/doc-view-4219.html?source=3\" }, { \"name\":\"填报学习路径\", \"link\":\"https://help.fanruan.com/finereport/doc-view-4103.html?source=3\" }, { \"name\":\"API接口汇总\", \"link\":\"https://help.fanruan.com/finereport/doc-view-4327.html?source=3\" }, { \"name\":\"文档月刊\", \"link\":\"https://help.fanruan.com/finereport/doc-view-4613.html?source=3\" } ]"; private static final String DEFAULT_RECOMMEND = "[ { \"name\":\"快速入门指南\", \"link\":\"" + QUICK_START_URL + "\" }, { \"name\":\"报表应用学习路径\", \"link\":\"" + REPORT_LEARNING_PATH + "\" }, { \"name\":\"参数应用学习路径\", \"link\":\"" + PARAMETER_LEARNING_PATH + "\" }, { \"name\":\"填报学习路径\", \"link\":\"" + FILL_LEARNING_PATH + "\" }, { \"name\":\"API接口汇总\", \"link\":\"" + API_SUMMARY + "\" }, { \"name\":\"文档月刊\", \"link\":\"" + MONTHLY_DOCUMENT + "\" } ]";
public static final String ALPHA_HELP_RECOMMEND = CloudCenter.getInstance().acquireUrlByKind("af.recommend", DEFAULT_RECOMMEND); public static final String ALPHA_HELP_RECOMMEND = CloudCenter.getInstance().acquireUrlByKind("af.recommend", DEFAULT_RECOMMEND);

2
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/action/StartUseAction.java

@ -22,7 +22,7 @@ public class StartUseAction implements ActionListener {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
String url = FineMarketClientHelper.getInstance().getTemplateDownLoadUrl(resourceDetail.getRoot()); String url = FineMarketClientHelper.getInstance().getResourceDownloadUrl(resourceDetail.getRoot());
if (url == null) { if (url == null) {
// 如果获取失败,跳转到所有模板页面 // 如果获取失败,跳转到所有模板页面
url = FineMarketClientHelper.getInstance().getFineMarketTemplateUrl(); url = FineMarketClientHelper.getInstance().getFineMarketTemplateUrl();

51
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineFrame.java

@ -506,7 +506,35 @@ public class AlphaFineFrame extends JFrame {
tabPane.repaint(); tabPane.repaint();
// 选中事件 // 选中事件
switch (selectedLabel.getCellType()) { switchTab(selectedLabel.getCellType(), readLabel);
if (currentSearchWorkerManager != null) {
AlphaFineList alphaFineList = currentSearchWorkerManager.getSearchResultList();
if (alphaFineList != null) {
alphaFineList.setSelectedIndex(0);
}
}
}
private Color defaultColor;
@Override
public void mouseEntered(MouseEvent e) {
defaultColor = selectedLabel.getForeground();
selectedLabel.setForeground(AlphaFineConstants.SUSPENDED_COLOR);
}
@Override
public void mouseExited(MouseEvent e) {
selectedLabel.setForeground(defaultColor);
}
};
}
// 方便记埋点
private void switchTab(CellType cellType, UILabel readLabel) {
switch (cellType) {
case PRODUCT_NEWS: case PRODUCT_NEWS:
readLabel.setVisible(true); readLabel.setVisible(true);
switchType(CellType.PRODUCT_NEWS); switchType(CellType.PRODUCT_NEWS);
@ -532,27 +560,6 @@ public class AlphaFineFrame extends JFrame {
switchType(CellType.TEMPLATE_SHOP); switchType(CellType.TEMPLATE_SHOP);
break; break;
} }
if (currentSearchWorkerManager != null) {
AlphaFineList alphaFineList = currentSearchWorkerManager.getSearchResultList();
if (alphaFineList != null) {
alphaFineList.setSelectedIndex(0);
}
}
}
private Color defaultColor;
@Override
public void mouseEntered(MouseEvent e) {
defaultColor = selectedLabel.getForeground();
selectedLabel.setForeground(AlphaFineConstants.SUSPENDED_COLOR);
}
@Override
public void mouseExited(MouseEvent e) {
selectedLabel.setForeground(defaultColor);
}
};
} }
private List<SelectedLabel> createSelectedLabelList() { private List<SelectedLabel> createSelectedLabelList() {

16
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/ProductNewsList.java

@ -5,18 +5,15 @@ import com.fr.design.mainframe.alphafine.AlphaFineConstants;
import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.AlphaFineHelper;
import com.fr.design.mainframe.alphafine.model.ProductNews; import com.fr.design.mainframe.alphafine.model.ProductNews;
import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.BrowseUtils;
import com.fr.log.FineLoggerFactory;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.ListModel;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Point; import java.awt.Point;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionAdapter;
import java.net.URI;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.ListModel;
/** /**
* @author hades * @author hades
@ -64,11 +61,16 @@ public class ProductNewsList extends JList<ProductNews> {
private void dealWithClick() { private void dealWithClick() {
ProductNews productNews = getSelectedValue(); ProductNews productNews = getSelectedValue();
BrowseUtils.browser(productNews.getUrl()); openNewsInBrowser(productNews.getUrl());
DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getReadSet().add(productNews.getId()); DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getReadSet().add(productNews.getId());
AlphaFineHelper.getAlphaFineDialog().repaint(); AlphaFineHelper.getAlphaFineDialog().repaint();
} }
// 方便埋点
private void openNewsInBrowser(String url) {
BrowseUtils.browser(url);
}
public int getHoverIndex() { public int getHoverIndex() {
return hoverIndex; return hoverIndex;
} }

49
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/model/ProductNews.java

@ -1,8 +1,12 @@
package com.fr.design.mainframe.alphafine.model; package com.fr.design.mainframe.alphafine.model;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import java.awt.Image; import java.awt.Image;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 产品动态 * 产品动态
@ -17,7 +21,9 @@ public class ProductNews {
private String title; private String title;
private Tag tag; private Tag tag;
private Target target;
// 推送对象,对象为 list<用户组id>
private List<String> target;
private Status status; private Status status;
private String url; private String url;
@ -26,6 +32,8 @@ public class ProductNews {
private Date pushDate; private Date pushDate;
public static final String ALL_USER_TARGET = "0";
/** /**
* 创建cid的用户 * 创建cid的用户
*/ */
@ -58,11 +66,11 @@ public class ProductNews {
return this; return this;
} }
public Target getTarget() { public List<String> getTarget() {
return target; return target;
} }
public ProductNews setTarget(Target target) { public ProductNews setTarget(List<String> target) {
this.target = target; this.target = target;
return this; return this;
} }
@ -172,29 +180,18 @@ public class ProductNews {
} }
} }
public enum Target { /**
ALL_USER(0); * 将接口中的target字段转换一下
* 原始数据是字符串例如"1,2,3,4"
private final int code; * 转换为 List<int>{1,2,3,4}
* */
Target(int code) { public static List<String> ParseTarget(String s) {
this.code = code; List<String> list = new ArrayList<>();
} if (s != null) {
String[] targets = s.split(",");
public int getCode() { list.addAll(Arrays.asList(targets));
return code; }
} return list;
public static Target parseCode(int code) {
for (Target target : values()) {
if (target.code == code) {
return target;
}
}
throw new IllegalArgumentException();
}
} }
} }

8
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateResourceDetailPane.java

@ -117,13 +117,17 @@ public class TemplateResourceDetailPane extends JPanel {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
super.mouseClicked(e); super.mouseClicked(e);
String url = data.getResourceUrl(); openResourceUrl(data.getResourceUrl());
BrowseUtils.browser(url);
} }
}); });
return linkLabel; return linkLabel;
} }
// 方便埋点
void openResourceUrl(String url) {
BrowseUtils.browser(url);
}
JButton createStartUseButton() { JButton createStartUseButton() {
JButton starUseButton = new JButton(START_USE); JButton starUseButton = new JButton(START_USE);
starUseButton.addActionListener(new StartUseAction(data)); starUseButton.addActionListener(new StartUseAction(data));

14
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/TemplateShopPane.java

@ -20,11 +20,11 @@ public class TemplateShopPane extends JPanel {
return INSTANCE; return INSTANCE;
} }
// public 方便埋点
private static final String DEFAULT_PAGE_PANEL = "defaultPagePane"; public static final String DEFAULT_PAGE_PANEL = "defaultPagePane";
private static final String PAGE_PANEL = "pagePane"; public static final String PAGE_PANEL = "pagePane";
private static final String DETAIL_PANEL = "detailPane"; public static final String DETAIL_PANEL = "detailPane";
private static final String LOADING_PANEL = "loadingPane"; public static final String LOADING_PANEL = "loadingPane";
private String currentCard = Strings.EMPTY; private String currentCard = Strings.EMPTY;
@ -99,6 +99,10 @@ public class TemplateShopPane extends JPanel {
} }
// 方便埋点,勿删
public String getCurrentCard() {
return currentCard;
}
private JPanel createContentPane(List<TemplateResource> templateResources) { private JPanel createContentPane(List<TemplateResource> templateResources) {
return new TemplateResourcePageGridPane(templateResources); return new TemplateResourcePageGridPane(templateResources);

29
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/helper/FineMarketClientHelper.java

@ -22,6 +22,7 @@ public class FineMarketClientHelper {
public static final String FINE_MARKET_TEMPLATE_INFO = CloudCenter.getInstance().acquireUrlByKind("market.template.info", "https://market.fanruan.com/templates/"); public static final String FINE_MARKET_TEMPLATE_INFO = CloudCenter.getInstance().acquireUrlByKind("market.template.info", "https://market.fanruan.com/templates/");
public static final String FINE_MARKET_TEMPLATE_URL = CloudCenter.getInstance().acquireUrlByKind("market.template.url", "https://market.fanruan.com/template/"); public static final String FINE_MARKET_TEMPLATE_URL = CloudCenter.getInstance().acquireUrlByKind("market.template.url", "https://market.fanruan.com/template/");
public static final String FILE_DOWNLOAD = "file/"; public static final String FILE_DOWNLOAD = "file/";
public static final String PACKAGE_DOWNLOAD = "package/download/";
public static final String TEMPLATES_PARENT_PACKAGE = "parent/"; public static final String TEMPLATES_PARENT_PACKAGE = "parent/";
public static final String TEMPLATES_TAGS = "filter"; public static final String TEMPLATES_TAGS = "filter";
public static final String NAME_SEARCH = "?searchKeyword="; public static final String NAME_SEARCH = "?searchKeyword=";
@ -39,17 +40,33 @@ public class FineMarketClientHelper {
/** /**
* 获取模板的下载链接 * 获取模板资源的下载链接
* */ * */
public String getTemplateDownLoadUrl(TemplateResource templateResource) { public String getResourceDownloadUrl(TemplateResource templateResource) {
String url = FINE_MARKET_TEMPLATE_INFO + FILE_DOWNLOAD; if (TemplateResource.Type.SCENARIO_SOLUTION.equals(templateResource.getType())) {
if (templateResource != null) { return getPackageDownloadUrl(templateResource.getId());
return url + templateResource.getId();
} else { } else {
return null; return getFileDownLoadUrl(templateResource.getId());
}
}
/**
* 打开浏览器打包并下载模板资源包可能会很慢
* */
private String getPackageDownloadUrl(String id) {
return FINE_MARKET_TEMPLATE_INFO + PACKAGE_DOWNLOAD + id;
} }
/**
* 打开浏览器下载单一模板
* */
private String getFileDownLoadUrl(String id) {
return FINE_MARKET_TEMPLATE_INFO + FILE_DOWNLOAD + id;
} }
/** /**
* 获取帆软市场模板资源页面链接 * 获取帆软市场模板资源页面链接
* */ * */

68
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ProductNewsSearchManager.java

@ -1,6 +1,7 @@
package com.fr.design.mainframe.alphafine.search.manager.impl; package com.fr.design.mainframe.alphafine.search.manager.impl;
import com.fr.concurrent.NamedThreadFactory; import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineConstants;
import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.AlphaFineHelper;
import com.fr.design.mainframe.alphafine.model.ProductNews; import com.fr.design.mainframe.alphafine.model.ProductNews;
@ -12,17 +13,19 @@ import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.imageio.ImageIO;
import java.awt.Image; import java.awt.Image;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
public class ProductNewsSearchManager { public class ProductNewsSearchManager {
@ -91,7 +94,7 @@ public class ProductNewsSearchManager {
setImage(getCoverImage(obj.getString("pic"))). setImage(getCoverImage(obj.getString("pic"))).
setUrl(obj.getString("url")).setTag(ProductNews.Tag.parseCode(obj.getInt("tag"))). setUrl(obj.getString("url")).setTag(ProductNews.Tag.parseCode(obj.getInt("tag"))).
setStatus(ProductNews.Status.parseCode(obj.getInt("status"))).setTarget( setStatus(ProductNews.Status.parseCode(obj.getInt("status"))).setTarget(
ProductNews.Target.parseCode(obj.getInt("target"))). ProductNews.ParseTarget(obj.getString("target"))).
setCreator(obj.getInt("creator")).setPushDate(new Date(obj.getLong("push_time"))); setCreator(obj.getInt("creator")).setPushDate(new Date(obj.getLong("push_time")));
Date currentDate = new Date(System.currentTimeMillis()); Date currentDate = new Date(System.currentTimeMillis());
// 推送时间check // 推送时间check
@ -100,9 +103,70 @@ public class ProductNewsSearchManager {
idSet.add(productNews.getId()); idSet.add(productNews.getId());
} }
} }
filterByDesignerId(productNewsList);
return productNewsList; return productNewsList;
} }
/**
* 将productNews根据设计器id进行过滤
* productNews有个target字段代表推送对象用户组检查设计器id是否在用户组中来进行过滤
* */
private List<ProductNews> filterByDesignerId(List<ProductNews> list) {
//设计器id
String designId = DesignerEnvManager.getEnvManager().getUUID();
HashMap<String, Set<String>> userGroupInfoCache = new HashMap<>();
//遍历资源,获取target下的所有用户组信息,检查是否包含设计器id
Iterator<ProductNews> iterator = list.iterator();
while (iterator.hasNext()) {
List<String> targets = iterator.next().getTarget();
boolean targetsContainDesignerId = false;
// 每条推送可能推送至多个用户组,需要逐一判断
for (String userGroupId : targets) {
// 没有记录的用户组信息需要请求一下
if (!userGroupInfoCache.containsKey(userGroupId)) {
userGroupInfoCache.put(userGroupId, searchUserGroupInfo(userGroupId));
}
// 判断设计器id是否在这个用户组中,在则退出判断,不在则继续
if (userGroupInfoCache.get(userGroupId).contains(designId) || userGroupId.equals(ProductNews.ALL_USER_TARGET)) {
targetsContainDesignerId = true;
break;
}
}
if (!targetsContainDesignerId) {
iterator.remove();
}
}
return list;
}
/**
* 根据用户组id查询用户组信息改用户组中的所有设计器id
* */
private Set<String> searchUserGroupInfo(String userGroupId) {
String url = AlphaFineConstants.ALPHA_CID_USER_GROUP_INFO + AlphaFineConstants.SEARCH_BY_ID + userGroupId;
Set<String> idSet = new HashSet<>();
try {
String jsonStr = HttpToolbox.get(url);
JSONObject jsonObject = new JSONObject(jsonStr);
JSONArray idArray = jsonObject.getJSONArray("data");
for (int i = 0; i < idArray.length(); i++) {
idSet.add(idArray.getJSONObject(i).getString("userid"));
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
}
return idSet;
}
public List<ProductNews> getCachedProductNewsList() { public List<ProductNews> getCachedProductNewsList() {
return productNewsList; return productNewsList;
} }

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

After

Width:  |  Height:  |  Size: 424 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 MiB

After

Width:  |  Height:  |  Size: 206 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/local_template4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 591 KiB

156
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/template_resource/local_templates.json

@ -1,106 +1,110 @@
[ [
{ {
"id": 20000736, "id": 20000770,
"name": "库存变动分析看板", "name": "PDCA销售运营闭环管理方案",
"uuid": "eee73cbe-441f-48a3-8b08-f27445a922df", "uuid": "7975ad73-9aea-4634-96f1-d33ec1b4283c",
"cid": "terminal-1,industry-3,purpose-3",
"description": "通过存货变动看板,财务分析人员或者管理会计可以根据指标的趋势、数据对比等进行分析。",
"vendor": "Victoria.", "vendor": "Victoria.",
"pic": "com\\fr\\design\\mainframe\\alphafine\\images\\local_template1.png",
"fileLoca": "库存变动分析看板.frm",
"uploadTime": "2022-05-07T09:11:54.000Z",
"tag": null,
"sellerId": 202, "sellerId": 202,
"style": "2", "cid": "industry-3,purpose-2,purpose-16,purpose-15",
"tag": null,
"pic": "com/fr/design/mainframe/alphafine/images/local_template1.png",
"price": 0, "price": 0,
"downloadTimes": 3931, "fileLoca": null,
"updateTime": "2022-05-07T09:11:54.000Z", "text": "<ol style=\"list-style-type: decimal;\" class=\" list-paddingleft-2\"><li><p>此方案共包括14张模板,其中12张可视化分析看板、1张分析报表以及1张填报表,需在10.0及以上版本设计器中预览;</p></li><li><p>了解方案详情,可移步-数据分析与可视化指南</p></li><li><p>如果您希望在线体验当前方案,可移步-<a href=\"https://demo.finereport.com/\" target=\"_self\">官方DEMO系统</a>:业务场景应用-&gt;营销管理<br/></p></li><li><p>如果您对此方案感兴趣,希望更加深入了解,可以填写此表单:<a href=\"https://t6ixa9nyl6.jiandaoyun.com/f/60dac9bd282e8e000796eac3\" target=\"_self\">方案需求录入</a>;后续会有帆软行业顾问将与您联系。<br/></p></li></ol>",
"description": "将PDCA循环嵌入销售运营管理的全流程中,从决策层、管理层与执行层三个层级,对目标制定、执行过程、复盘分析、问题跟踪进行全方位精细化管理。",
"updateTime": "2022-06-15T06:36:39.000Z",
"downloadTimes": 1152,
"state": 1,
"designVersion": "10.0", "designVersion": "10.0",
"involvePlugins": "none", "involvePlugins": null,
"pkgsize": 0, "uploadTime": "2022-06-15T06:36:39.000Z",
"style": null,
"link": "template", "link": "template",
"score": 16.519018, "sellerName": "Victoria.",
"url": "https://market.fanruan.com/template/20000736", "pluginName": [],
"text": "<ol style=\\\"list-style-type: decimal;\\\" class=\\\" list-paddingleft-2\\\"><li><p>该模板需用10.0及以上版本设计器预览<br/></p></li><li><p>该模板为库存场景解决方案的部分内容,全部内容可下载<a href=\\\"https://market.fanruan.com/template/20000733\\\" target=\\\"_self\\\">库存场景解决方案</a>查看</p></li><li><p>为保障模板预览效果,建议安装<a href=\\\"https://help.fanruan.com/finereport10.0/doc-view-3665.html\\\" target=\\\"_self\\\">新自适应插件</a>(FR11.0版本插件已内置,无需手动安装),有使用需求或疑问,请联系帆软技术支持咨询<br/></p></li></ol>", "pkgsize": 14,
"parentName": "库存场景解决方案", "material": "方案附件.rar",
"tagsName": "制造加工,采购" "tagsName": "制造加工,营销,组织,管理,经营汇报"
}, },
{ {
"id": 20000578, "id": 20000733,
"name": "采购综合分析", "name": "库存场景解决方案",
"uuid": "6dff455a-3a78-461e-8534-0a092fdf60ef", "uuid": "43d1c14b-1a73-41e6-adcc-aaf2872bc8d4",
"cid": "terminal-1,industry-3,purpose-3",
"description": "综合分析看板中,主要从采购全流程销量监控、重点模块独立分析的角度进行数据分析。决策者可以直接根据看板中的数据进行采购全流程的全面把控、定位责任模块,释放管理压力。",
"vendor": "Victoria.", "vendor": "Victoria.",
"pic": "com\\fr\\design\\mainframe\\alphafine\\images\\local_template2.png",
"fileLoca": "采购综合分析.frm",
"uploadTime": "2022-05-07T09:15:07.000Z",
"tag": null,
"sellerId": 202, "sellerId": 202,
"style": "1", "cid": "industry-3,purpose-5",
"tag": null,
"pic": "com/fr/design/mainframe/alphafine/images/local_template2.png",
"price": 0, "price": 0,
"downloadTimes": 2715, "fileLoca": null,
"updateTime": "2022-05-07T09:15:07.000Z", "text": "<p>当前库存管理面临的现状:库存成本劣势明显、库存周转差距较大。如果对此没有合理有效的解决方案,往往会导致企业库存越来越混乱,经营、资金、成本等问题丛生。</p><p>库存管理解决方案从:“盘”、“析”、“管”三个方向开展,彻底解决库存量大、结构复杂、管理混乱等常见问题</p>",
"description": "库存管理解决方案即从:“盘”、“析”、“管”三个方向开展,对导致库存管理问题的原因逐一击破。",
"updateTime": "2022-05-05T03:53:55.000Z",
"downloadTimes": 816,
"state": 1,
"designVersion": "10.0", "designVersion": "10.0",
"involvePlugins": "none", "involvePlugins": null,
"pkgsize": 0, "uploadTime": "2022-05-05T03:53:55.000Z",
"style": null,
"link": "template", "link": "template",
"score": 16.519018, "sellerName": "Victoria.",
"url": "https://market.fanruan.com/template/20000578", "pluginName": [],
"text": "<ol style=\\\"list-style-type: decimal;\\\" class=\\\" list-paddingleft-2\\\"><li><p>看板包括采购流程中的主要节点、预算分析、降本分析、物料消耗情况等。</p></li><li><p>为保障模板预览效果,建议安装<a href=\\\"https://help.fanruan.com/finereport10.0/doc-view-3665.html\\\" target=\\\"_self\\\">新自适应插件</a>(FR11.0版本插件已内置,无需手动安装),有使用需求或疑问,请联系帆软技术支持咨询<br/></p></li></ol>", "pkgsize": 11,
"parentName": "采购场景解决方案", "material": "",
"tagsName": "制造加工,采购" "tagsName":"制造加工,库存"
}, },
{ {
"id": 20000780, "id": 20000581,
"name": "仓储物流综合管理平台", "name": "采购场景解决方案",
"uuid": "d94fcc7e61b44af4bde68a7aa769df3e", "uuid": "7994b01f-5069-4554-83cf-9d3506e30767",
"cid": "template_type-2,terminal-1,industry-4,purpose-5,purpose-6,purpose-4", "vendor": "Victoria.",
"description": "仓储物流综合管理平台包含园区内的车流、人流、物流监控,仓库内景工作状态监控,码头集装箱监控三大场景。实现仓储物流全方位动态管理。", "sellerId": 202,
"vendor": "finereport", "cid": "industry-3,purpose-3",
"pic": "com\\fr\\design\\mainframe\\alphafine\\images\\local_template3.png",
"fileLoca": "仓储物流综合管理.zip",
"uploadTime": "2022-06-29T06:07:16.000Z",
"tag": null, "tag": null,
"sellerId": 1, "pic": "com/fr/design/mainframe/alphafine/images/local_template3.png",
"style": "简约清新",
"price": 0, "price": 0,
"downloadTimes": 149, "fileLoca": null,
"updateTime": "2022-06-29T06:07:16.000Z", "text": "<p>采购场景方案具体细节可参考:<a href=\"https://help.fanruan.com/dvg/doc-view-151.html\" target=\"_self\">可视化指南-采购场景应用</a><br/></p>",
"description": "采购解决方案采用:“自上而下”的分析思路,针对采购相关的不同角色层级及其不同角度发数据分析需求,产出不同的内容",
"updateTime": "2022-03-10T03:50:17.000Z",
"downloadTimes": 2353,
"state": 1,
"designVersion": "10.0", "designVersion": "10.0",
"involvePlugins": "1162", "involvePlugins": null,
"pkgsize": 0, "uploadTime": "2022-03-10T03:50:18.000Z",
"style": null,
"link": "template", "link": "template",
"score": 18.520216, "sellerName": "Victoria.",
"url": "https://market.fanruan.com/template/20000780", "pluginName": [],
"text": "<p>1.本大屏场景要求使用FR11.0正式发布版本,且必须将“fvs大屏编辑模式”插件更新到1.4版本,设置方法请查看帮助文档:<a href=\\\"https://help.fanruan.com/finereport/doc-view-4188.html?source=0&from=demoshop\\\"target=\\\"_blank\\\">FVS插件安装及配置要求</a></p>\\n<p>2.压缩包内包含仓储物流综合管理模板以及三个钻取页面的文件。需要把两个弹窗内容文件和主文件一起放在报表目录文件夹下,设置对应的预览链接。弹窗和网页链接的设置方法参考:<a href=\\\"https://help.fanruan.com/finereport/doc-view-4400.html?source=0&from=demoshop\\\"target=\\\"_blank\\\">FVS点击跳出弹出框</a> 、<a href=\\\"https://help.fanruan.com/finereport/doc-view-4399.html?source=0&from=demoshop\\\"target=\\\"_blank\\\">FVS点击跳转网页链接</a></p>\\n<p>3.仓储物流综合管理模板使用了自定义模型组件,并设置了模型动画。详情请查看文档:<a href=\\\"https://help.fanruan.com/finereport/doc-view-4496.html?source=0&from=demoshop\\\"target=\\\"_blank\\\">FVS自定义模型组件</a></p>", "pkgsize": 6,
"parentName": "", "material": "",
"tagsName": "交通运输,库存,物流生产" "tagsName": "制造加工,采购"
}, },
{ {
"id": 20000779, "id": 20000747,
"name": "考勤异常提醒", "name": "费用预算系统解决方案",
"uuid": "b0c0bc3ba3f744a6b2299c69d4d55f31", "uuid": "0776533469c3401a8da78706856b6b02",
"cid": "template_type-3,terminal-2,industry-7,purpose-8",
"description": "考勤异常提醒场景通过 FineReport 移动端微信集成和移动端推送,实现每月考勤周期末将考勤异常数据推送给企业员工。\n员工可以在手机上打开异常报表预览,及时处理异常数据,降低企业HR部门的沟通成本。\n其中异常报表包括员工当月出勤汇总情况和异常记录情况。\n详细说明见文档:考勤异常提醒-https://help.fanruan.com/dvg/doc-view-212.html?source=0&from=shopdemo\n",
"vendor": "finereport", "vendor": "finereport",
"pic": "com\\fr\\design\\mainframe\\alphafine\\images\\local_template4.png",
"fileLoca": "考勤异常提醒.rar",
"uploadTime": "2022-06-27T02:55:34.000Z",
"tag": null,
"sellerId": 1, "sellerId": 1,
"style": "简约清新", "cid": "template_type-1,terminal-1,industry-13,purpose-1",
"tag": null,
"pic": "com/fr/design/mainframe/alphafine/images/local_template4.png",
"price": 0, "price": 0,
"downloadTimes": 46, "fileLoca": "费用预算系统解决方案.zip",
"updateTime": "2022-06-27T02:55:34.000Z", "text": "<p>模板中使用了数据查询数据集,如果要在本地打开,需要在自己的数据库中建表,并修改数据连接。</p><p>1)建表语句见附件文件夹:SQL语句与表。</p><p><br>2)数据连接默认为 FRDemo,如果用户表所在的数据库连接不是 FRDemo,将模板中数据连接修改为用户默认的数据连接。</p><p><br>3)模板中 SQL 语句为 MYSQL 数据库,若用户使用中数据库语句不匹配,可对应修改为匹配的语句。</p><p><br>4)模板中有大量的超链接,用户存在本地后,预览时注意修改超链接。</p><p><br>5)费用预算系统的平台沿用人事管理系统的平台配置,如果要在本地体验效果,可先下载人事管理系统部署:</span><a href=\"https://help.fanruan.com/dvg/doc-view-6.html?source=0&from=demoshop\" target=\"_blank\" style=\"text-decoration: underline; color: rgb(28, 133, 231); font-family: arial, helvetica, sans-serif;\"><span style=\"font-family: arial, helvetica, sans-serif;\">人事管理系统</span></a><span style=\"font-family: arial, helvetica, sans-serif;\"><br></p><p>模板中图标等背景样式见背景附件。 如果数据替换麻烦,可直接使用内置数据集模板,但内置模板只提供了样式,控件、数据等不能联动。如何制作,可查看帮助文档:</span><a href=\"https://help.fanruan.com/dvg/doc-view-124.html?source=0&from=demoshop\" target=\"_blank\" style=\"text-decoration: underline; color: rgb(28, 133, 231); font-family: arial, helvetica, sans-serif;\"><span style=\"font-family: arial, helvetica, sans-serif;\">费用预算系统</span></a><span style=\"font-family: arial, helvetica, sans-serif;\"></p>",
"description": "费用预算系统是通过 FineReport 填报功能和平台功能结合实现的审批流程系统。能够在线采集数据,提供标准数据模板,解决不同部门、子公司之间数据不统一的问题,\n实现记录预算审批与更改的操作,审批与更改记录留痕等。\n详细内容可查看帮助文档:</span><a href=\"https://help.fanruan.com/dvg/doc-view-124.html?source=0&from=demoshop\" target=\"_blank\" style=\"text-decoration: underline; color: rgb(28, 133, 231); font-family: arial, helvetica, sans-serif;\"><span style=\"font-family: arial, helvetica, sans-serif;\">费用预算系统</span></a><span style=\"font-family: arial, helvetica, sans-serif;\">",
"updateTime": "2022-05-15T05:34:45.000Z",
"downloadTimes": 141,
"state": 1,
"designVersion": "10.0", "designVersion": "10.0",
"involvePlugins": null, "involvePlugins": null,
"pkgsize": 0, "uploadTime": "2022-05-15T05:34:45.000Z",
"style": "简约清新",
"link": "template", "link": "template",
"score": 18.520168, "sellerName": "finereport",
"url": "https://market.fanruan.com/template/20000779", "pluginName": [],
"text": "<p>一、附件内容说明</p>\\n<p>1)04考勤异常提醒.frm:模板,数据为「数据库查询」数据集,可使用 2) 的语句将数据导入自己的数据库后,连接数据查看。</p>\\n<p>2)Hr_考勤早晚卡记录.sql:Hr_考勤早晚卡记录表的 DDL 语句,可以直接在自己的数据库中还原Hr_考勤早晚卡记录表。</p>\\n<p>3)内置数据集模板:内置数据的模板,不替换数据的情况可查看样式,涉及数据变化,如参数查询等功能不支持</p>\\n<p>4)素材:模板中用到的素材</p>\\n<p>二、使用说明</p>\\n<p>1)下载后先在个人数据库表中准备数据,打开模板后替换数据连接即可查看,不想替换可使用内置数据集的模板。</p>\\n<p>2)注意附件只提供模板,推送效果需要将自己的工程与微信集成,在工程上设置定时调度后使用,相关内容可查看文档。</p>\",\"description\":\"<p>考勤异常提醒场景通过 FineReport 移动端微信集成和移动端推送,实现每月考勤周期末将考勤异常数据推送给企业员工。\\n员工可以在手机上打开异常报表预览,及时处理异常数据,降低企业HR部门的沟通成本。</p>\\n<p>其中异常报表包括员工当月出勤汇总情况和异常记录情况。</p>\\n<p>详细说明见文档:考勤异常提醒-https://help.fanruan.com/dvg/doc-view-212.html?source=0&from=shopdemo</p>", "pkgsize": 1,
"parentName": "", "material": null,
"tagsName": "批发零售,人力资源" "tagsName": "IT互联网,财务"
} }
] ]
Loading…
Cancel
Save